2011-11-21 14 views
8

He estado tratando de aprender más sobre el motor de plantillas de Django, ya que siempre me ha parecido una caja negra. The documentation ofrece un buen resumen de los pasos generales implicados e indica que la plantilla se carga y analiza, creando un árbol de nodos que se representan (en cascada?) Con un contexto y se anexan para obtener el resultado.¿Cómo se analizan las plantillas de django?

Lo que no entiendo es el enfoque del análisis sintáctico y bajo qué criterios se crean los nodos? ¿Qué constituye un nodo particular después del análisis y cómo afecta esto a la creación de etiquetas de plantilla personalizadas (es decir, existe una forma mejor y más eficiente de escribir etiquetas de plantilla que conducirían a menos nodos?).

+0

empecé a leer 'django.template.base' pero salieron tan pronto como me sentí poderosa, mágica momento de flexión (05 a.m. como Goto). Por el contrario votaré y verifico en la mañana :) –

+0

¡Lo puse en mi lista de tareas pendientes! –

Respuesta

2

Creo que lo primero que debe ver es code.djangoproject.com con django/template/base.py - el primero (como Yuji Tomita declaró anteriormente). O descargue fuentes y mire con su editor favorito o IDE.

3

Una forma de entender más sobre el proceso es ejecutar django con el werkzeug debugger y desencadenar una excepción en una plantilla. De esta forma, podrás ver (e interactuar) con toda la pila hasta ese punto.

0

supongo que utilizan tokenizing y analizar

una forma sencilla de describirlo es:

Tokenización: ruptura appart el código para tipos como:

integer foo = "bar" + 15; 

esto consiste en

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

después de esto, puede analizar mediante la prueba g para encontrar patrones con un analizador

análisis:

encontrar el patrón:

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

esta manera se puede ejecutar un comando

Si te gusta experimentar con esto me podría recomendar a utilice "ANTLR" http://www.antlr.org/ Está disponible en muchos idiomas diferentes, como Java o C# e incluso PHP y JS

3

Se crea un nodo de cada etiqueta. Puede hacerse una idea de cómo funciona leyendo how to write custom tags. Todo lo que está dentro de la etiqueta será sus hijos. Este es un ejemplo de una etiqueta de comentario de django docs:

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

como se ve etiqueta de comentario analizará todo hasta el "endcomment" y va a tirar a la basura. Otras etiquetas pasarían nodelist a SometagNode() y las usarán para renderizar.

La representación se realiza de forma recursiva. Cuando se llama a un render() en el nodo, ejecuta el procesamiento en sus elementos secundarios, etc.

de análisis se realiza de forma recursiva, así es por esto que se puede obtener etiquetas anidadas y parser.parse() se las arreglan para encontrar la correcta adecuación etiqueta de cierre, ya que cuando se hace el análisis y se tropieza en una etiqueta que llama do_tag() cosa, que a su vez llamar la parser.parse() otra vez para encontrar la etiqueta de cierre más cercana y se envolver todo en un nodo, devolver un nodo, el mayor parser.parse() se puso en una lista de nodos y continuará a buscar la etiqueta de cierre.

objeto Contexto en nodos es una especie de lista de estructura dicts. Se presiona el contexto adicional sobre el contexto existente y se pasa a los nodos hijos y se muestra después de que se represente el nodo para que no afecte al alcance superior.

Para las etiquetas que no tienen hijos la parser.parse() no se utiliza, y así instancia nodo es devuelto sin hijos.

Cuestiones relacionadas