Я намагаюся забрати Jinja2 TemplateSyntaxError
щоб дізнатись, чому це не означає точне ім'я файлу, в якому виявлено помилку синтаксису.
Я насправді представляю цю помилку в під-шаблоні, щоб спробувати краще зрозуміти цю систему шаблонів. Після отримання синтаксичної помилки я бачу File "<unknown>", line 4, in template
у моєму попереджувальному сервері Flask. Номер рядка правильний, але відладчик з'являється в замішанні про файл, з якого виникла проблема, що дуже дратує. Я ще не визначився з назвою об'єкта коду, template
репрезентує
Як зазначив хтось, <unknown>
Використовується тут як віддалений, коли значення імені файлу об'єкта коду є нульовим. Прочитавши через а мало хто посилання для об'єктних кодів, я ще не мав щастя обернути мою голову навколо цієї дивності.
Здається, що хтось отримує подібну помилку в це github питання.
Відповіді:
1 для відповіді № 1Може бути, це лише довільне значення, надане Jinja2, для деякого динамічно генерованого коду?
>>> code = compile("print("test")", "<unknown>", "exec")
>>> code
<code object <module> at 0x1064b6e30, file "<unknown>", line 1>
>>> exec code
test
>>> code.co_filename
"<unknown>"
І там, здається, справді є jinja2 / debug.py - translate_syntax_error.
Пояснення того, чому це, є досить простим. Вся техніка, починаючи з flask.render_template_string
через jinja2.Environment.from_string
до обробників винятків Jinja2 не беруть ніякого занепокоєння з приводу походження рядка шаблону, що передається.
Хоча можна було б ще тоннельінформація зверху вниз, яка б користь цього в будь-якому випадку? У випадку винятку ви отримуєте повний слід стека з відповідною локальною інформацією, доступною на кожному його рівні, у тому числі, звідки ви передали в рядку та номер рядка в рядок шаблону, що помилився, наприклад:
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".