Sto cercando di distinguere Jinja2 "s TemplateSyntaxError
per capire perché non mi dice esattamente il nome del file in cui viene trovato un errore di sintassi.
In realtà sto introducendo questo errore in un sub-template appositamente per cercare di capire meglio questo sistema di template. Quando ottengo l'errore di sintassi, vedo File "<unknown>", line 4, in template
nel mio server di anteprima Flask. Il numero di riga è corretto, ma il debugger appare confuso riguardo al file da cui è originato il problema, il che è molto fastidioso. Sono ancora incerto sul nome dell'oggetto codice, template
rappresenta.
Come qualcuno ha sottolineato, il <unknown>
è usato qui come throwaway quando il valore del nome file dell'oggetto codice è nullo. Dopo aver letto attraverso a pochi Riferimenti per gli oggetti in codice, non ho ancora avuto fortuna ad avvolgere la mia mente in questa stranezza.
Qualcuno sembra avere un errore simile in questo problema github.
risposte:
1 per risposta № 1Potrebbe essere che è solo un valore arbitrario fornito da Jinja2 a un codice generato dinamicamente?
>>> code = compile("print("test")", "<unknown>", "exec")
>>> code
<code object <module> at 0x1064b6e30, file "<unknown>", line 1>
>>> exec code
test
>>> code.co_filename
"<unknown>"
E sembra che ci sia davvero dentro jinja2 / debug.py - translate_syntax_error.
La spiegazione del perché è piuttosto semplice. L'intero macchinario, a partire da flask.render_template_string
attraverso jinja2.Environment.from_string
verso i gestori di eccezioni Jinja2 non si preoccupa dell'origine della stringa di modello passata.
Mentre sarebbe possibile scavare un po 'di piùinformazioni dall'alto in basso, quale sarebbe il beneficio di esso comunque? In caso di eccezione si ottiene una traccia dello stack completa con le informazioni locali appropriate disponibili su ciascun livello di esso, incluso da dove si è passati nella stringa e il numero di riga nella stringa del modello errato, ad esempio:
File "jinja2-uknown-filename.py", line 7, in index
return flask.render_template_string("this is a n n {% test %}")
...
File "<unknown>", line 3, in template
TemplateSyntaxError: Encountered unknown tag "test".