Jinja: importierte Vorlagen werden zu lange zwischengespeichert

Erstellt am 16. Juli 2013  ·  4Kommentare  ·  Quelle: pallets/jinja

Ich habe eine Vorlage namens main.html. Es {% importiert %} ein Modul namens module_a (ohne Kontext). module_a {% importiert %} module_b auf die gleiche Weise.

Wenn ich module_a ändere, erkennt das der Template-Loader und lädt es neu.

Wenn ich module_b ändere, erkennt es der Vorlagenlader nicht. Ich muss den Vorgang neu starten.

Ich glaube, das liegt daran, dass der generierte Code für module_a die Importe in seiner root()-Funktion durchführt. get_template sieht, dass module_a auf dem neuesten Stand ist, lädt es also nicht neu, führt also seine root()-Funktion nicht erneut aus.

Ich bin mir nicht sicher, wie ich das ansprechen soll. Offensichtlich ist der Aufruf von root() bei jedem Aufruf von get_template schlecht. Die umfassendste Lösung wäre, die Abhängigkeiten jeder Vorlage zu verfolgen, aber das ist eine Menge Arbeit.

Hilfreichster Kommentar

Das Problem ist, dass Importe zwischengespeichert, aber nicht nachverfolgt werden. Ich bin mir nicht sicher, was der beste Weg wäre, damit umzugehen.

Alle 4 Kommentare

Wir stoßen auch darauf an. (Ich hätte diesen Fehler fast nicht gefunden, weil Sie den Begriff auto_reload nicht verwendet haben – dies ist nur relevant, wenn auto_reload=True ).

Es sieht so aus, als wäre dies ziemlich schwierig zu beheben. Idealerweise möchten Sie, dass die von get_source zurückgegebene uptodate -Methode nicht nur die Quelldatei selbst prüft, sondern auch jede Quelldatei, die sie importiert, erweitert oder einschließt. Aber an dem Punkt, an dem uptodate definiert ist, haben Sie nur die rohe, nicht geparste Quelle, sodass keine Informationen verfügbar sind.

Es könnte auf einer höheren Ebene implementiert werden (z. B. in Template.is_up_to_date ), aber das scheint auch einen erheblichen Eingriff erfordern zu müssen, um die Abhängigkeitsinformationen vom Compiler zurückzubekommen.

Ich bin auch gerade darauf gestoßen. Das ist ziemlich nervig in der Entwicklung, weil es bedeutet, dass ich cache_size auf 0 setzen muss, und dann wird es sehr langsam (wie zu erwarten war).

Ich werde versuchen, in den Interna zu graben, um zu sehen, ob ich etwas herausfinde. Wenn in der Zwischenzeit jemand mit mehr Erfahrung eine Lösung oder sogar eine Richtung vorschlagen könnte, wäre das wirklich großartig!

Das Problem ist, dass Importe zwischengespeichert, aber nicht nachverfolgt werden. Ich bin mir nicht sicher, was der beste Weg wäre, damit umzugehen.

Ok, das Problem hier ist also nicht das Zwischenspeichern der Vorlage, sondern das Zwischenspeichern von Variablen, die an die importierten Makros übergeben werden.
(zumindest in meinem Fall)

Meine Problemumgehung bestand darin, eine Methode zu verwenden, die meine aktualisierten Kontextwerte zum Rendern zurückgibt.

In meinem Szenario habe ich ein Makro für die Paginierung erstellt. Das Makro benötigte das Anforderungsobjekt.

erster Ansatz innerhalb des Makros
{% set pagenum, limit = request.args.pg , request.args.limit %}
Dies funktioniert zunächst, aber bei nachfolgenden Anforderungen werden die Makrokontextwerte für immer zwischengespeichert, es sei denn, ein Server wird neu gestartet

Arbeitsweise innerhalb des Makros
{% set pagenum, limit = request.get_params() %}
Dies gibt nun bei jedem Aufruf meine aktualisierten Anforderungsparameter zurück, ohne das Caching meiner Makros zu opfern.

Mir ist auch aufgefallen, dass das Zwischenspeichern der Makros meine Reaktionszeiten um das 2,5-fache beschleunigt.
Ohne Caching ~= 450ms
Mit Caching ~= 150ms

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen