如何获取存在语法错误的Jinja嵌套模板的文件名及行号?
获取Jinja嵌套模板错误的文件名和行号
我太懂这个痛点了——Jinja默认抛出的TemplateError在嵌套模板场景下只会给你行号,完全不知道是哪个子模板出的问题,定位起来简直头疼。不过好在Jinja藏了个实用的属性能解决这个问题,咱们直接从错误对象里扒模板信息就行。
修复后的代码
把你的异常处理改成这样,就能同时拿到文件名和行号了:
try: response = render_document_template(render_arguments) except TemplateError as error: line_number = error.lineno # 取出错的模板文件名,兼容非文件加载的模板场景 template_filename = error.template.filename if hasattr(error, 'template') else "Unnamed template" error_details = f"Error in template `{template_filename}` at line {line_number}: {str(error)}" return Response( error_details, status=status.HTTP_500_INTERNAL_SERVER_ERROR )
原理说明
当Jinja渲染包含其他模板的文件时,抛出的语法错误(比如TemplateSyntaxError,它是TemplateError的子类)会携带一个template属性,这个属性指向出错的那个具体模板实例。而实例的filename属性就是该模板对应的文件路径或名称——不管是主模板还是嵌套的子模板,都能精准定位。
额外小提醒
- 如果你的模板是直接从字符串渲染的(不是从文件加载),
filename会是None,所以加个hasattr判断能避免抛出额外的属性错误。 - 要是遇到多层嵌套的复杂错误,还可以看看
error.original_error属性,它能帮你追溯更底层的错误根源,但大多数情况下error.template就足够搞定定位问题了。
内容的提问来源于stack exchange,提问作者Xar
相关产品推荐
相关产品推荐

