django模板引擎有错误检查?

时间:2016-02-22 12:03:07

标签: python django templates exception

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

然而,我现在这样做只是:

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

使用默认的Web输出模板引擎。这已将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()方法中逃脱。

所以:

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

1 个答案:

答案 0 :(得分:4)

以下是我使用自定义类和string_if_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': [
               ....
            ],
        },
    },
]
顺便说一下,你可以在下面的文章(我写的)http://www.webforefront.com/django/customizedjangotemplates.html#stringifinvaliderror

中获得有关其如何/为何起作用的其他信息