在开发过程中,我应该如何验证Django模板中的HTML?
-
28-09-2019 - |
题
我尚未使用Django's和Python内置的测试功能,但我最终想开始...而在整个开发过程中,我想检查的最明显的事情之一是我所有的页面都可以验证在所有可能的情况下。
最好的方法是什么?
解决方案
好问题。我自己还没有做到这一点,因此希望会有一些更好的答案,但是您可能想研究HTML验证中间件:
- http://djangosnippets.org/snippets/1312/
- http://lukeplant.me.uk/resources/djangovalidator/
- http://bstpierre.org/projects/htmlvalidatormiddleware/
根据您的应用程序,“在所有可能的情况下”可能要要求。例如,如果您制作下一个Facebook,并因此每天接受大量的用户数据,那么在某个时候会出现一些事情,从而破坏您网站上页面的有效性。
由于验证错误不会倾向于破坏功能,因此可以接受一些有限的测试数据检查,然后在出现时对错误做出反应。我相信这被称为 愚蠢驱动的测试.
其他提示
或者,在通常的单元测试过程中,您可以在网站上验证网站的滚动方法将看起来像这样:
- 经历你的
urls.py
并为网站生成尽可能多的URL - 采用 内置的Django测试客户端 获取每个URL
- 以某种方式验证他们(请参阅 python中的验证(x)html)
不确定是否有人对此进行了任何工作是可重复使用的。
一种解决方案是制作一个脚本,该脚本根据变量测试值的输入字典呈现所有模板。
检索模板中定义的变量列表的主要逻辑是:
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
更多细节 在此博客文章中.
不隶属于 StackOverflow