嘿!检查你的HTML!
项目描述
django-html-validator
一个用于验证从Django应用程序生成的HTML的工具。Python 3兼容。
许可:MPL 2
警告!
如果您不下载本地的vnu.jar
文件(见下文),它将使用validator.nu并将您的HTML发送到那里。
如果您使用htmlvalidator
来验证测试,您的HTML不太可能包含任何敏感或可识别的信息,但如果您使用中间件选项,存在潜在风险。
安装
首先,非常简单
pip install django-html-validator
注意,除非您选择如何使用它并且您还需要通过设置明确启用它,否则它不会做任何事情。
基本上,您可以选择如何使用这个
- 作为中间件
- 在您的单元测试中(技术上它们是Django中的集成测试)
如果您选择将其设置为中间件并相应地启用它,它将针对测试中的每个渲染的模板运行。而不仅仅是当您运行服务器时。
设置
无论您如何使用htmlvalidator
,您都需要将其打开。默认情况下是关闭的。用于此的设置是
HTMLVALIDATOR_ENABLED = True
此操作的作用是打印所有验证错误到stdout
。但不会阻止执行继续运行。即使有错误。
要使执行在出现任何验证错误时停止,请在您的设置中打开此选项
HTMLVALIDATOR_FAILFAST = True
现在,如果有任何验证错误通过客户端,您将触发一个htmlvalidator.exceptions.ValidationError
异常。
同样,如果您将其作为中间件运行并且启用了此设置,它将在请求中引发异常。
当遇到验证错误和警告时,htmlvalidator
将HTML输出到一个文件,并将错误输出到具有相同名称但扩展名为.txt
的文件中。默认情况下,它将输出到系统的tmp目录下的htmlvalidator
子目录中,例如/tmp/htmlvalidator/
。如果您想覆盖此设置
HTMLVALIDATOR_DUMPDIR = '~/validationerrors/' # default it /tmp
无论您设置什么,目录不需要存在,但其父目录必须存在。
默认情况下,当htmlvalidator
遇到验证错误时,它将在HTMLVALIDATOR_DUMPDIR
中存储相关的HTML文件,并在同一目录中存储具有.txt
扩展名的文件。或者,您可以直接将验证错误和警告输出到stdout,如下所示
HTMLVALIDATOR_OUTPUT = 'stdout' # default is 'file'
设置vnu.jar路径
默认情况下,所有验证都是通过将您的HTML以HTTP POST方式发送到html5.validator.nu来完成的。
这不仅会给他们的服务器带来很大压力。尤其是如果您有很多测试。它也因依赖于网络延迟而缓慢。一个更好的方法是下载他们的最新版本上的vnu.jar
文件。
您只需这样设置即可
HTMLVALIDATOR_VNU_JAR = '~/downloads/vnu.jar'
这还需要安装java,因为这是在命令行上执行.jar
文件的方式。
请注意,调用这个vnu.jar
文件相当慢。超过2秒并不罕见。一个更快的替代方案是使用vnu.jar
运行本地的验证器Web实例,并通过不设置HTMLVALIDATOR_VNU_JAR
并将验证指向该实例来做到这一点
HTMLVALIDATOR_VNU_URL = 'http://localhost:8888/'
验证器的本地Web实例通常可以通过以下方式启动
java -cp vnu.jar nu.validator.servlet.Main 8888
在服务器运行时进行验证
一种在服务器运行时进行HTML验证的方法是在例如使用./manage.py runserver
的情况下。
为此,您需要启用中间件。在您的设置模块中,将htmlvalidator.middleware.HTMLValidator
追加到MIDDLEWARE_CLASSES
,例如如下所示
if HTMLVALIDATOR_ENABLED:
MIDDLEWARE_CLASSES += ("htmlvalidator.middleware.HTMLValidator",)
您也可以无条件地将它直接添加到MIDDLEWARE_CLASSES
中,除非启用,否则它不会做任何事情(除了加载)。有关更多信息,请参见关于HTMLVALIDATOR_ENABLED
的说明。
此外,如果您启用了HTMLVALIDATOR_FAILFAST
,当运行htmlvalidator
中间件时,它将一看到无效的HTML就引发异常。
在测试中进行HTML验证
假设您有一个进行测试的类。默认情况下,它已经有一个self.client
,您可以使用它来发出请求。您只需要将其替换为htmlvalidator.client.ValidatingClient
类。例如
from django.test import TestCase
from htmlvalidator.client import ValidatingClient
class MyAppTests(TestCase):
def setUp(self):
super(MyAppTests, self).setUp()
self.client = ValidatingClient()
def test_homepage(self):
response = self.client.get('/')
self.assertEqual(response.status_code, 200)
项目详情
下载文件
下载适用于您平台的自定义文件。如果您不确定该选择哪个,请学习有关安装包的更多信息。