nach Jinja2 Kompilierung Erweiterung enthält
Frage
In Jinja2 ist es möglich, eine Node
vom AST haben zu machen, nachdem alle include
Anweisungen abgeschlossen haben?
Dies ist ein Schlüssel Stück einer Lösung ein größeres Rätsel .
Beispielcode:
x.py
from jinja2 import nodes, Environment, FileSystemLoader
from jinja2.ext import Extension
class XExtension(Extension):
tags = set(['x', 'get_x'])
def __init__(self, environment):
super(XExtension, self).__init__(environment)
environment.extend(
x = 0,
)
def parse(self, parser):
tag = parser.stream.next()
return getattr(self, "_%s" % str(tag))(parser, tag)
def _get_x(self, parser, tag):
""" Return the output """
return nodes.Const(self.environment.x)
def _x(self, parser, tag):
""" Add an x """
self.environment.x += 1
return nodes.Const('<!-- Adding an X -->')
env = Environment(
loader = FileSystemLoader('.'),
extensions = [XExtension],
)
template = env.get_template('x.html')
print template.render()
x.html
Xx {% x %} Xx {% x %}
{% include "y.html" %}
Xs xes: {% get_x %}
y.html
Yx {% x %}
Ys xes: {% get_x %}
Die Ausgabe ist
Xx <!-- Adding an X --> Xx <!-- Adding an X -->
Yx <!-- Adding an X -->
Ys xes:3
Xs xes 2
Wie kann es möglich sein Xs xes
zu haben, um die X in y.html
zählen, die das Verhalten, das ich wünsche und erwarten?
Mit anderen Worten ist es eine Möglichkeit, die Analyse oder Abflachung zu Text aus dem _get_x()
in x.html
zurück zu verzögern?
Vielen Dank für das Lesen.
Mit freundlichen Grüßen
Brian
Lösung
Jinja2 nicht Streaming von Schablonendaten. Die Vorlage wird Anweisung für Anweisung in einen Strom von kleineren Strings ausgewertet, die in einen tatsächlichen Unicode-String durch die render()
Methode verkettet werden. Sie können aber auch halten den Strom bekommen durch den Aufruf in generate()
statt render()
.
Mit einiger In-Band-Signalisierung und Nachbearbeitung des Stroms könnte man wahrscheinlich in der Lage sein, so etwas zu implementieren, aber es ist gegen die Art und Weise, wie Jinja2 wurde so konzipiert, es brechen könnte schrecklich und ist völlig nicht unterstützt.