如何验证django模板的语法?

5 投票
1 回答
1771 浏览
提问于 2025-04-21 07:24

我希望客户的管理员能够编辑他们网站发送的各种状态邮件。这些邮件其实就是一些很简单的django模板,存储在数据库里。

我想确认这些邮件没有语法错误、缺少变量等等,但我找不到简单的方法来做到这一点。

对于未知的区块标签,检查起来比较简单:

from django import template

def render(templ, **args):
    """Convenience function to render a template with `args` as the context.
       The rendered template is normalized to 1 space between 'words'.
    """
    try:
        t = template.Template(templ)
        out_text = t.render(template.Context(args))
        normalized = ' '.join(out_text.split())
    except template.TemplateSyntaxError as e:
        normalized = str(e)
    return normalized

def test_unknown_tag():
    txt = render("""
      a {% b %} c
    """)
    assert txt == "Invalid block tag: 'b'"

不过,我不知道怎么检测一个空变量。我知道有一个叫TEMPLATE_STRING_IF_INVALID的设置,但那是针对整个网站的设置。

def test_missing_value():
    txt = render("""
      a {{ b }} c
    """)
    assert txt == "?"

缺少闭合标签或值也不会引发任何异常……

def test_missing_close_tag():
    txt = render("""
      a {% b c
    """)
    assert txt == "?"

def test_missing_close_value():
    txt = render("""
      a {{ b c
    """)
    assert txt == "?"

我是不是得从头开始写一个解析器来做基本的语法验证呢?

1 个回答

3

我不知道怎么检测一个变量是否为空呢?

class CheckContext(template.Context):

    allowed_vars = ['foo', 'bar', 'baz']

    def __getitem__(self, k):
        if k in self.allowed_vars:
            return 'something'
        else:
            raise SomeError('bad variable name %s' % k)

缺少结束标签或者值也不会引发任何异常……

你可以简单地检查一下渲染出来的字符串中是否还有 {%}} 这些符号。

撰写回答