2011-11-21 29 views
8

Ho cercato di saperne di più sul motore dei modelli di Django perché mi è sempre sembrato un po 'nero. The documentation fornisce una buona struttura dei passaggi generali coinvolti e indica che il modello è stato caricato e analizzato, creando un albero di nodi che sono resi (in una cascata?) Con un contesto e aggiunti insieme per dare il risultato.Come vengono analizzati i modelli di Django?

Quello che non capisco è l'approccio alla analisi, e in quali criteri vengono creati i nodi? Cosa costituisce un nodo particolare dopo l'analisi e in che modo ciò influisce sulla creazione di tag modello personalizzati (vale a dire che esiste un modo migliore e più efficiente per scrivere tag modello che porterebbe a meno nodi?).

+0

Ho iniziato a leggere 'django.template.base', ma sono uscito non appena ho percepito una magia potente e in grado di piegare il tempo (come goto 5am). I'll upvote e check in al mattino invece :) –

+0

L'ho messo nella mia lista delle cose da fare! –

risposta

2

Penso che la prima cosa da guardare sia code.djangoproject.com con django/template/base.py - il primo (come dichiarato Yuji Tomita prima). Oppure scarica le fonti e guarda attraverso il tuo editor o IDE preferito.

3

Un modo per comprendere meglio il processo è eseguire django con werkzeug debugger e attivare un'eccezione in un modello. In questo modo, sarai in grado di visualizzare (e interagire) con l'intero stack fino a quel momento.

0

Credo che usano creazione di token e l'analisi

un modo semplice per potrei solo è:

creazione di token: pausa appart il codice a tipi come:

integer foo = "bar" + 15; 

questo è costituito

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

dopo questo è possibile analizzare da tryin g di trovare modelli con un parser

analisi:

trovare il modello:

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

questo modo è possibile eseguire un comando

Se vi piace sperimentare con questo ho potuto consiglio a utilizzare "ANTLR" Disponibile in molte lingue diverse come Java o C# e anche PHP e JS

3

Un nodo viene creato da ogni tag. Puoi avere un'idea di come funziona leggendo attraverso how to write custom tags. Tutto ciò che è all'interno del tag sarà i suoi figli. Ecco un esempio di un tag di commento da Django docs:

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

come vedi tag di commento analizzerà tutto fino a quando il "endcomment" e getterà via. Altri tag passerebbero da nodelist a SometagNode() e lo utilizzeranno per il rendering.

Il rendering viene eseguito in modo ricorsivo. Quando viene richiamato un rendering() sul nodo, esegue il rendering sui suoi figli e così via.

analisi viene fatta in modo ricorsivo e questo è il motivo per cui è possibile ottenere i tag annidati e parser.parse() riuscirà a trovare il giusto abbinamento tag di chiusura, perché quando lo fa il parsing e inciampa su un tag che chiama do_tag() cosa, che a sua volta chiamata il parser.parse() di nuovo per trovare il tag di chiusura più vicino e avvolgerà tutto in un nodo, restituirà un nodo, il parser.parse() più alto lo metterà in un elenco di nodi e continuerà a cercare il tag di chiusura.

L'oggetto di contesto nei nodi è un tipo di elenco di struttura di dicts. Il contesto aggiuntivo viene inserito sopra il contesto esistente e passato ai nodi figli e visualizzato dopo il rendering del nodo, in modo che non influenzi l'ambito superiore.

Per i tag che non hanno figli, lo parser.parse() non viene utilizzato e quindi l'istanza del nodo viene restituita senza figli.

Problemi correlati