Wie werden Django-Templates analysiert?

  • Ich habe versucht, mehr über die Template-Engine von Django zu lernen, da sie mir immer wie eine Blackbox vorkam. Die Dokumentation gibt eine Ein guter Überblick über die allgemeinen Schritte und zeigt an, dass die Vorlage geladen und analysiert wird. Dabei wird ein Knotenbaum erstellt, der (in einer Kaskade?) mit einem Kontext gerendert und zusammengefügt wird, um das Ergebnis zu erhalten.

    Was ich nicht verstehe, ist der Ansatz zum Parsen und nach welchen Kriterien werden die Knoten erstellt? Was macht einen bestimmten Knoten nach dem Parsen aus und wie wirkt sich dies auf die Erstellung benutzerdefinierter Vorlagen-Tags aus (d. H. Gibt es eine bessere und effizientere Methode zum Schreiben von Vorlagen-Tags, die zu weniger Knoten führen würden?).

    22 November 2011
    Timmy O'Mahony
3 answers
  • Aus jedem Tag wird ein Knoten erstellt. Sie können sich ein Bild machen, wie es funktioniert, indem Sie lesen, wie Sie benutzerdefinierte Tags schreiben . Alles, was sich innerhalb des Tags befindet, sind seine Kinder. Hier ist ein Beispiel für ein Kommentar-Tag aus django docs:

     def do_comment(parser, token):
        nodelist = parser.parse(('endcomment',))
        parser.delete_first_token()
        return CommentNode()
     

    Wenn Sie sehen, dass das Kommentar-Tag alles bis analysiert die "endcomment" und wird es wegwerfen. Andere Tags würden nodelist an SometagNode() übergeben und zum Rendern verwenden.

    Das Rendern erfolgt rekursiv. Wenn ein render () auf einem Knoten aufgerufen wird, wird es auf seinen untergeordneten Elementen usw. ausgeführt.

    Die Analyse wird ebenfalls rekursiv ausgeführt. Aus diesem Grund können Sie verschachtelte Tags und parser.parse() erhalten. wird es schaffen, das passende passende schließende Tag zu finden, denn wenn es analysiert und über ein Tag stolpert, ruft es das do_tag() -Ding auf, das wiederum parser.parse() erneut aufruft, um das nächstliegende schließende Tag zu finden, und alles in einen Knoten einschließen Wenn Sie einen Knoten zurückgeben, wird der höhere Wert von parser.parse () in eine Knotenliste aufgenommen und die Suche nach dem schließenden Tag fortgesetzt.

    Kontextobjekt in Knoten ist eine Art Liste der Diktierstruktur. Zusätzlicher Kontext wird über den vorhandenen Kontext hinausgegeben und an untergeordnete Knoten übergeben und nach dem Rendern des Knotens ausgeblendet, sodass der obere Bereich nicht beeinträchtigt wird.

    Für Tags, die dies nicht tun haben Kinder, die parser.parse() werden nicht verwendet, und die Knoteninstanz wird ohne Kinder zurückgegeben.

    09 October 2014
    Ski
  • Ich denke, Sie sollten sich zuerst code.djangoproject ansehen .com mit django / template / base.py - der erste (wie Yuji Tomita zuvor schon sagte). Oder laden Sie Quellen herunter, und durchsuchen Sie sie mit Ihrem bevorzugten Editor oder IDE.

    28 November 2011
    sepulchered
  • Ich nehme an, dass sie Tokenizing und Parsing verwenden.

    Ein einfacher Weg, um sie zu beschreiben, ist:

    Tokenizing: break appart den Code auf Typen wie:

     integer foo = "bar" + 15;
     

    dies besteht aus

     T_VARIABLETYPE  + T_VARIABLENAME  + T_EQUALS + T_STRING + T_PLUS + T_DIGIT + T_SEMI
     

    Danach können Sie analysieren, indem Sie versuchen, Muster mit einem Parser zu finden.

    Parsing:

    Finden Sie das Muster:

     T_VARIABLETYPE  + T_VARIABLENAME  + T_EQUALS + {A recursive thing} + T_SEMI
     

    Auf diese Weise können Sie ein ausführen Befehl

    Wenn Sie damit experimentieren möchten, können Sie "ANTLR" http://www.antlr.org/ Erhältlich in vielen verschiedenen Sprachen wie Java oder C # und sogar PHP und JS

    28 January 2012
    Spidfire