Staram się wybrać Jinja2 TemplateSyntaxError
aby zobaczyć, dlaczego nie mówi mi dokładnej nazwy pliku, w której znaleziono błąd składniowy.
Właściwie wprowadzam ten błąd w pod-szablonie, aby lepiej zrozumieć ten system szablonów. Po otrzymaniu błędu składniowego widzę File "<unknown>", line 4, in template
na moim serwerze podglądu Flask. Numer linii jest poprawny, ale debuger wydaje się zdezorientowany co do pliku, z którego pochodzi problem, co jest bardzo denerwujące. Nie jestem pewien co do nazwy obiektu kodu, template
reprezentuje.
Jak ktoś zauważył, <unknown>
jest tutaj używane jako rzut, gdy wartość pliku obiektu kodu jest null. Po przeczytaniu mało referencje w przypadku obiektów kodu nie miałem jeszcze szczęścia owijania głowy wokół tej dziwności.
Ktoś wydaje się mieć podobny błąd ten problem z Githubem.
Odpowiedzi:
1 dla odpowiedzi № 1Czy może to być dowolna wartość dostarczona przez Jinja2 do jakiegoś dynamicznie generowanego kodu?
>>> code = compile("print("test")", "<unknown>", "exec")
>>> code
<code object <module> at 0x1064b6e30, file "<unknown>", line 1>
>>> exec code
test
>>> code.co_filename
"<unknown>"
I tam rzeczywiście jest jinja2 / debug.py - translate_syntax_error.
Wyjaśnienie, dlaczego tak jest, jest dość proste. Cała maszyna, począwszy od flask.render_template_string
przez jinja2.Environment.from_string
aż do Jinja2 procedury obsługi wyjątków nie przejmują się początkiem przekazywanego ciągu szablonu.
Chociaż można tunelować jeszcze trochęinformacje z góry na dół, co i tak by to przyniosło? W przypadku wyjątku otrzymujesz kompletny ślad stosu z odpowiednimi lokalnymi informacjami dostępnymi na każdym jego poziomie, w tym z miejsca, w którym podałeś ciąg i numer linii w łańcuchu szablonu, który został błędnie wybrany, np .:
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".