Ich habe versucht, mehr über Djangos Templating-Engine zu erfahren, da es für mich immer wie eine Art Black Box war. Die Dokumentation gibt einen guten Überblick über das allgemeine Thema beteiligten Schritte und zeigt an, dass die Vorlage geladen und geparst wird, indem eine Baumstruktur von Knoten erzeugt wird, die (in einer Kaskade?) mit einem Kontext gerendert und zusammengefügt werden, um das Ergebnis zu liefern.
Was ich nicht verstehe, ist die Vorgehensweise beim Parsen und unter welchen Kriterien werden die Knoten erstellt? Was macht einen bestimmten Knoten nach dem Parsing aus und wie wirkt sich dies auf die Erstellung von benutzerdefinierten Template-Tags aus (d. H. Gibt es eine bessere und effizientere Möglichkeit, Template-Tags zu schreiben, die zu weniger Knoten führen würden?).
Eine Möglichkeit, mehr über den Prozess zu erfahren, ist es, django mit dem werkzeug Debugger auszuführen und eine Ausnahme auszulösen Vorlage. Auf diese Weise können Sie den gesamten Stack bis zu diesem Punkt anzeigen (und interagieren).
Aus jedem Tag wird ein Knoten erstellt. Sie können sich eine Vorstellung davon machen, wie es funktioniert, indem Sie benutzerdefinierte Tags schreiben . Alles, was sich in dem Tag befindet, sind seine Kinder. Hier ist ein Beispiel für ein Kommentar-Tag aus django docs:
%Vor% Wie Sie sehen, wird das Kommentar-Tag alles bis zum "Endkommentar" analysieren und es wegwerfen. Andere Tags würden nodelist
an SometagNode()
übergeben und sie zum Rendern verwenden.
Das Rendern erfolgt rekursiv. Wenn ein render () auf einem Knoten aufgerufen wird, wird der Rendervorgang für seine untergeordneten Elemente usw. ausgeführt.
Das Parsen erfolgt rekursiv, deshalb können Sie geschachtelte Tags bekommen und parser.parse()
wird es schaffen, das passende passende schließende Tag zu finden, denn wenn es parsiert und auf einem Tag stolpert, ruft es do_tag()
ding auf, was in turn ruft das parser.parse()
erneut auf, um das nächstgelegene schließende Tag zu finden, und wickelt alles in einen Knoten, gibt einen Knoten zurück, der höhere parser.parse () fügt es in eine Knotenliste ein und sucht weiter nach dem schließenden Tag.
Kontextobjekt in Knoten ist eine Art Liste von Dicts-Struktur. Zusätzlicher Kontext wird über den vorhandenen Kontext geschoben und an die untergeordneten Knoten übergeben und nach dem Rendern des Knotens ausgegeben, so dass der obere Bereich nicht beeinflusst wird.
Für Tags, die keine untergeordneten Elemente haben, wird parser.parse()
nicht verwendet, sodass die Knoteninstanz ohne untergeordnete Elemente zurückgegeben wird.
Ich denke, das erste, was Sie sich ansehen sollten, ist code.djangoproject.com mit django / template / base.py - der erste (wie Yuji Tomita schon sagte). Oder lade Quellen herunter und schaue sie mit deinem Lieblings-Editor oder IDE durch.
Ich denke, sie verwenden Tokenizing und Parsing
Eine einfache Art zu beschreiben ist:
Tokenisierung: Teilen Sie den Code in Typen wie:
%Vor%besteht aus
%Vor%Danach können Sie analysieren, indem Sie versuchen, Muster mit einem Parser zu finden
Analyse:
finde das Muster:
%Vor%Auf diese Weise können Sie einen Befehl ausführen
Wenn Sie damit experimentieren möchten, könnte ich "ANTLR" Ссылка empfehlen Es ist in vielen verschiedenen Sprachen wie Java oder C # und sogar PHP und JS
verfügbarTags und Links django django-templates