如何在开发过程中验证Django模板中的HTML?

时间:2010-06-21 16:51:06

标签: html django html-validation

我还没有使用过Django和Python的内置测试功能,但我想最终开始......而且在整个开发过程中我想要检查的最明显的事情之一就是所有我的页面在所有可能的场景中都会验证。

最好的方法是什么?

5 个答案:

答案 0 :(得分:7)

好问题。我自己没有这样做,所以希望会有更好的答案,但你可能想看看HTML验证中间件:

“在所有可能的情况下”可能要求太多,具体取决于您的应用程序。例如,如果您制作下一个Facebook,并因此每天接受大量用户数据,某些内容会在某些时候出现,从而破坏您网站上网页的有效性。

由于验证错误不会破坏功能,因此检查某些有限的测试数据可能是一种可接受的方法,然后在出现错误时做出反应。我相信这被称为stupidity-driven testing

答案 1 :(得分:2)

或者,在通常的单元测试过程中,通过自己动手验证网站页面的方法看起来像这样:

  1. 浏览urls.py并为网站生成尽可能多的网址
  2. 使用the built-in Django test client获取每个网址
  3. 以某种方式验证它们(参见Validate (X)HTML in Python
  4. 不确定是否有人在此处完成任何工作是可重复使用的方式。

答案 2 :(得分:1)

一种解决方案是制作一个脚本,根据变量测试值的输入字典呈现所有模板。

检索模板中定义的变量列表的主要逻辑如下:

from django.template.loader import get_template

def extract_required_vars(node):
    if not hasattr(node, 'nodelist'):
        return []
    var_names = []
    for child_node in node.nodelist:
        if isinstance(child_node, VariableNode):
            var_names.append(child_node.filter_expression.token)
        elif isinstance(child_node, ForNode):
            var_names.append(child_node.sequence.var.var)
        elif isinstance(child_node, ExtendsNode):
            template = get_template(child_node.parent_name.var)
            var_names.extend(extract_required_vars(template))
        elif isinstance(child_node, IncludeNode):
            template = get_template(child_node.template.var)
            var_names.extend(extract_required_vars(template))
        var_names.extend(extract_required_vars(child_node))
    return var_names

required_vars = extract_required_vars(get_template('index.html'))

然后,脚本会检查模板中定义的变量是在项目设置中还是在用户提供的dict中作为测试输入。

/path/to/project/templates/templates/allusers.html
  -> ok: users, STATIC_URL
/path/to/project/templates/entrer-en-contact.html
  -> ok: contactform, STATIC_URL
/path/to/project/templates/dest-summary.html
  -> ok: STATIC_URL
  -> missing: dest_username

更多详情in this blog post

答案 3 :(得分:1)

请参阅django-extensions项目,它具有一个内置的模板验证器,可以通过如下的管理命令来运行:

python manage.py validate_templates

这仅尝试使用django的模板加载器加载模板,因此请检查是否缺少标签。只要它可以创建Template对象,它将通过。这里是更多documentation on get_template,它是它调用的方法。

答案 4 :(得分:0)

Django Check HTML Middleware 可以检测 HTML 中的拼写错误:

https://github.com/guettli/django-check-html-middleware