gpt4 book ai didi

python - 具有错误检查功能的django模板引擎?

转载 作者:太空狗 更新时间:2023-10-30 01:13:22 26 4
gpt4 key购买 nike

我有一个 Django 应用程序,它使用 Django 模板系统生成其(非 HTML)输出,以及 Web UI。有一组页面,用户可以在其中为报告创建模板,添加用于变量替换的 {{ }} 标签,以及一个额外的模板标签库来很好地格式化内容。

但是,我目前的做法是:

t = Template(component_template)
self.output_content = t.render(component_context)

它使用默认的网络输出模板引擎。这已将 string_if_invalid 设置为 None,并且手册中有关于如果您更改它会破坏管理页面的可怕警告。

因此,如果用户在标签的变量名中输入错误,它会被悄悄地忽略并进入输出。如果他们有一个损坏的标签,它实际上会杀死网络应用程序。我正在寻找一种在编辑时验证模板的方法,以便可以警告用户需要进行更改。

我的目标是类似编译器输出的东西:

unknown variable 'ffsdfd' on line 33 of template
template syntax error on line 22 of template

我的第一个想法是创建一个新的模板 Engine() 并将其用于这个目的,这样我就可以发现一个独特的默认 string_if_invalid 但这并没有告诉我任何关于 缺失/不正确的变量。

engine = Engine(string_if_invalid="!!MISSING_VARIABLE!!", dirs=settings.TEMPLATES[0]['DIRS'],
context_processors=settings.TEMPLATES[0]['OPTIONS']['context_processors'],
app_dirs=settings.TEMPLATES[0]['APP_DIRS'])

t = Template(component_template, engine=engine)

try:
self.output_content = t.render(component_context)
except TemplateSyntaxError:
pass # do something useful here to collect error messages

TemplateSyntaxError 异常有效,除了我没有得到任何上下文信息,比如错误实际在哪里,当然我只得到第一个失败。查看 django.template 代码,看起来内部有某种扩展异常具有行号和导致它阻塞的标记,但它不会从 render() 方法中逃脱。

所以:

如何为用户编辑的模板中的错误提供有用的错误处理?我应该以完全不同的方式来做这件事吗?

最佳答案

以下是我使用自定义类和 string_if_invalid 自行解决的方法。它为您提供了变量名称,但我相信您可以进一步调整它以获得额外的上下文信息。

全局 settings.py 示例,应该很容易适应您的内联示例:

class InvalidTemplateVariable(str):
def __mod__(self,other):
from django.template.base import TemplateSyntaxError
raise TemplateSyntaxError("Invalid variable : '%s'" % other)

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [....],
'APP_DIRS': True,
'OPTIONS': {
'string_if_invalid': InvalidTemplateVariable("%s"),
'context_processors': [
....
],
},
},
]

顺便说一句,您可以在以下文章(我写的)http://www.webforefront.com/django/customizedjangotemplates.html#stringifinvaliderror 中获得有关其工作方式/原因的更多信息。

关于python - 具有错误检查功能的django模板引擎?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35553138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com