Python 带有错误检查的django模板引擎?

Python 带有错误检查的django模板引擎?,python,django,templates,exception,Python,Django,Templates,Exception,我有一个Django应用程序,它使用Django模板系统生成其(非HTML)输出,以及web UI。有一组页面,用户可以在其中为报表创建模板,为变量替换添加{{}}标记,以及一个额外的templatetag库来很好地格式化内容 然而,我目前的做法是: t = Template(component_template) self.output_content = t.render(component_context) 它使用默认的web输出模板引擎。如果无效,则将字符串设置为None,并在手册中发

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

然而,我目前的做法是:

t = Template(component_template)
self.output_content = t.render(component_context)
它使用默认的web输出模板引擎。如果无效,则将
字符串设置为
None
,并在手册中发出可怕的警告,警告您如果更改,将破坏管理员页面

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

我的目标是编译器输出:

unknown variable 'ffsdfd' on line 33 of template
template syntax error on line 22 of template
我的第一个想法是创建一个新的模板引擎()并将其用于这一目的,这样如果无效,我就可以发现一个独特的默认值
string\u,但这并不能告诉我缺少/不正确的变量

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\u if\u invalid
来解决这个问题的。它为您提供了变量名,但我相信您可以进一步调整它以获得其他上下文信息

Global 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': [
               ....
            ],
        },
    },
]

顺便说一句,你可以在下面的文章(我写的)中获得更多关于如何/为什么这样做的信息。

Aha!因此,实际上我缺少的部分是:“如果string\u If\u invalid包含“%s”,那么格式标记将被替换为无效变量的名称。”()(但是从str到exception的转换很好!)