Estoy tratando de desarmar Jinja2 s TemplateSyntaxError
para ver por qué no me dice el nombre exacto del archivo en el que se encuentra un error de sintaxis.
En realidad, estoy introduciendo este error en una sub-plantilla con el propósito de intentar comprender mejor este sistema de plantillas. Al obtener el error de sintaxis, veo File "<unknown>", line 4, in template
en mi servidor de vista previa de matraz. El número de línea es correcto, pero el depurador parece confundido sobre el archivo desde el cual se originó el problema, lo cual es muy molesto. Todavía no estoy seguro de cuál es el nombre del objeto de código, template
representa
Como alguien ha señalado, la <unknown>
se usa aquí como un descarte cuando el valor del nombre de archivo del objeto de código es nulo. Después de leer un pocos referencias para los objetos de código, todavía no he tenido la suerte de envolver mi cabeza en torno a esta rareza.
Alguien parece tener un error similar en este problema github.
Respuestas
1 para la respuesta № 1¿Puede ser que sea solo un valor arbitrario proporcionado por Jinja2 a algún código generado dinámicamente?
>>> code = compile("print("test")", "<unknown>", "exec")
>>> code
<code object <module> at 0x1064b6e30, file "<unknown>", line 1>
>>> exec code
test
>>> code.co_filename
"<unknown>"
Y allí parece estar ciertamente en jinja2 / debug.py - translate_syntax_error.
La explicación de por qué eso es bastante sencillo. Toda la maquinaria, comenzando con flask.render_template_string
mediante jinja2.Environment.from_string
hasta los manejadores de excepciones Jinja2 no se preocupa por el origen de la cadena de plantilla que se pasa.
Si bien sería posible hacer un túnel másInformación de arriba abajo, ¿cuál sería el beneficio de todos modos? En el caso de una excepción, obtiene un seguimiento completo de la pila con la información local apropiada disponible en cada nivel del mismo, incluido el lugar desde donde pasó la cadena y el número de línea en la cadena de la plantilla que erró, por ejemplo:
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".