/ / Dlaczego interpretując szablony Jinja2, obiekt kodu ma pustą nazwę? - python, jinja2

Czy interpretując szablony Jinja2, obiekt kodu ma zerową nazwę? - python, jinja2

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 № 1

Czy 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".