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

Posted

技术标签:

【中文标题】在开发过程中我应该如何验证 Django 模板中的 HTML?【英文标题】:How should I validate HTML in Django templates during the development process? 【发布时间】:2011-03-06 10:10:57 【问题描述】:

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

最好的方法是什么?

【问题讨论】:

【参考方案1】:

Django Check html 中间件可以检测 HTML 中的拼写错误:

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

【讨论】:

【参考方案2】:

参见django-extensions 项目,它有一个内置的模板验证器,可以使用这样的管理命令运行:

python manage.py validate_templates

这只会尝试使用 django 的模板加载器来加载您的模板,因此会检查是否缺少标签等内容。只要它可以创建一个模板对象,它就会通过。这里有更多documentation on get_template,这是它调用的方法。

【讨论】:

这不会验证 HTML,它只检查 Django 模板语法中的语法错误。但是那个项目很酷,谢谢你的链接! 没错,它只验证语法。取决于您要验证的内容。就我而言,我使用 axe-selenium-python - axe-selenium-python 验证了 html 的可访问性。对于放大器验证,amphtml-validator 一个节点包。希望这会有所帮助:)【参考方案3】:

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

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

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'))

脚本然后检查模板中定义的变量是否在项目设置中或在用户提供的作为测试输入的字典中。

/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.

【讨论】:

【参考方案4】:

另外,在您通常的单元测试过程中验证您网站上的页面的自行滚动方法如下所示:

    查看您的urls.py 并尽可能多地为该网站生成 URL 使用the built-in Django test client 获取每个网址 以某种方式验证它们(请参阅Validate (X)HTML in Python)

不确定是否有人在这方面做过任何工作,这是一种可重用的方式。

【讨论】:

【参考方案5】:

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

http://djangosnippets.org/snippets/1312/ http://lukeplant.me.uk/resources/djangovalidator/ http://bstpierre.org/Projects/HtmlValidatorMiddleware/

“在所有可能的情况下”可能要求太多,具体取决于您的应用。例如,如果您创建了下一个 Facebook,因此每天都在接受大量的用户数据,那么在某些时候就会出现破坏您网站上页面有效性的内容。

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

【讨论】:

谢谢 :) 我会调查的。我以前看过 sn-p 链接,但其余的对我来说是新的(我喜欢愚蠢驱动的测试概念:D)。是的,我想“所有可能的情况”要求太多了——仅仅使用平面页面就可以将大量无效的 HTML 引入网站。但是,我仍然很好奇 manage.py 测试 app_name 是否有任何解决方案,以及该方法与中间件方法的实用性相比如何。不过喜欢你的回答:) 当然,将其纳入您的测试过程。不确定是否有人完成了艰苦的工作,但我想您需要一种方法来检查您的 urls.py 并为该站点生成尽可能多的 URL。然后您可以使用the built-in Django test client 获取所有这些网址,并使用something else to validate them。 谢谢,我想你的两个答案就是我所需要的 :) 现在由我来尝试最适合我的方法以及在什么情况下 :) 祝你好运——如果你想出好东西,发表并成名!

以上是关于在开发过程中我应该如何验证 Django 模板中的 HTML?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较 Django 模板中的两个查询集?

如何访问 Django 模板列表中的字典?

如何将引导类添加到模板中的 Django CreateView 表单字段?

Django模板系统(非常详细)(后台数据如何展示在前台)

Django:模板中的 Crispy 表单验证错误

如何将 Django 的内置身份验证与自定义表单(html 模板)一起使用