Skip to main content

Yo! Check your HTML!

Project description

django-html-validator
=====================

[![Build Status](https://travis-ci.org/peterbe/django-html-validator.svg?branch=master)](https://travis-ci.org/peterbe/django-html-validator)

A tool to do validation of your HTML generated from your Django app.
Python 3 compatible.

License: [MPL 2](http://www.mozilla.org/MPL/2.0/)


Warning!
--------

If you don't download a local `vnu.jar` file (see below), it will use
[validator.nu](https://validator.nu/) and **send your HTML there**.

If you use `htmlvalidator` to validate tests it's unlikely your HTML contains
anything sensitive or personally identifyable but if you use the middleware
option there's a potential risk.

Install
-------

First things first, very simple:

pip install django-html-validator

Note, it won't do anything until you chose how you want to use it and you also
need to explicitly enable it with a setting.

Basically, you have a choice of how you want to use this:

* As a middleware
* In your unit tests (technically they're integration tests in Django)

If you chose to set it up as a middleware and enable it accordingly it will
run for every rendered template in the tests too. Not just when you run the
server.

Settings
--------

Independent of how you use `htmlvalidator` you need to switch it on.
It's not on by default. The setting to do that is:

```python
HTMLVALIDATOR_ENABLED = True
```

What this does, is that it prints all validation errors to `stdout`.
But it doesn't stop the execution from running. Even if there are errors.

To make it so that the execution stops as soon as there is any validation
error switch this on in your settings:

```python
HTMLVALIDATOR_FAILFAST = True
```

Now, if there's any validation error going through the client you'll
get a `htmlvalidator.exceptions.ValidationError` exception raised.

Equally, if you're running it as a middleware and have this setting on it
will raise the exception in the request.

When validation errors and warnings are encountered, `htmlvalidator` will
dump the HTML to a file and the errors in a file with the same name except
with the extension `.txt` instead. It will dump this into, by default, the
systems tmp directory and in sub-directory called `htmlvalidator`.
E.g. `/tmp/htmlvalidator/`. If you want to override that change:

```python
HTMLVALIDATOR_DUMPDIR = '~/validationerrors/' # default it /tmp
```
Whatever you set, the directory doesn't need to exist but its parent does.

By default when `htmlvalidator` encounters validation errors it stores
the relevant HTML file in the `HTMLVALIDATOR_DUMPDIR` together with a file
with the extension `.txt` in the same directory. Alternatively you can just let
it dump the validation errors and warnings straight onto stdout with:

```python
HTMLVALIDATOR_OUTPUT = 'stdout' # default is 'file'
```

Setting the vnu.jar path
------------------------

By default, all validation is done by sending your HTML with HTTP POST to
[html5.validator.nu](https://html5.validator.nu/).

Not only does this put a lot of stress on their server. Especially if you have
a lot of tests. It's also slow because it depends on network latency. A much
better way is to download the `vnu.jar` file from their
[latest release](https://github.com/validator/validator/releases) on
[GitHub page](https://github.com/validator/).

You set it up simply like this:

```python
HTMLVALIDATOR_VNU_JAR = '~/downloads/vnu.jar'
```

This also **requires java to be installed** because that's how `.jar` files are
executed on the command line.

Be aware that calling this `vnu.jar` file is quite slow. Over 2 seconds is
not unusual. A faster alternative is to use the `vnu.jar` to run a local web
instance of the validator, and pointing validation to use that by *NOT* setting
`HTMLVALIDATOR_VNU_JAR` and doing this instead:

```python
HTMLVALIDATOR_VNU_URL = 'http://localhost:8888/'
```

The local web instance of the validator can be started typically by:

```
java -cp vnu.jar nu.validator.servlet.Main 8888
```

Validating during running the server
------------------------------------

A way to do HTML validation is to do it during running the
server. E.g. with `./manage.py runserver`.

To do that you need to enable the middleware. In your settings module,
append `htmlvalidator.middleware.HTMLValidator`
to `MIDDLEWARE_CLASSES` for example like this:

```python
if HTMLVALIDATOR_ENABLED:
MIDDLEWARE_CLASSES += ("htmlvalidator.middleware.HTMLValidator",)
```

You can also add it directly and unconditionally to `MIDDLEWARE_CLASSES`
and it won't do anything (except be loaded) unless enabled, see
the note above about `HTMLVALIDATOR_ENABLED` for more info.

Also, if you enable `HTMLVALIDATOR_FAILFAST`, when running the
`htmlvalidator` middleware it will raise an exception as soon as it
sees some invalid HTML.


Validating HTML in tests
------------------------

Suppose you have a class that does tests. By default it already has a
`self.client` which you use to make requests. All you need to do is to
replace it with the `htmlvalidator.client.ValidatingClient`
class. For example:

```python

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-html-validator-0.4.7.tar.gz (7.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

django_html_validator-0.4.7-py3-none-any.whl (10.2 kB view details)

Uploaded Python 3

django_html_validator-0.4.7-py2.py3-none-any.whl (10.2 kB view details)

Uploaded Python 2Python 3

django_html_validator-0.4.7-py2-none-any.whl (10.2 kB view details)

Uploaded Python 2

File details

Details for the file django-html-validator-0.4.7.tar.gz.

File metadata

File hashes

Hashes for django-html-validator-0.4.7.tar.gz
Algorithm Hash digest
SHA256 1c9516d7278626f2fff41218d06b3f7b2c4015d84f83f8d0e988e75699f1072a
MD5 a208c91ea49a25a5698463ae5979e964
BLAKE2b-256 e8dc418399a2005ecce389c9689be63424eab301b0452b15c811e6680796e8f5

See more details on using hashes here.

File details

Details for the file django_html_validator-0.4.7-py3-none-any.whl.

File metadata

File hashes

Hashes for django_html_validator-0.4.7-py3-none-any.whl
Algorithm Hash digest
SHA256 b838443a7947b1a5a9e1aafbf9c6ffbcb1bc28cb69334ae8e33c54787e42fb1c
MD5 a2b39a673db2c1663093133ebc74fc3a
BLAKE2b-256 5296f58e07549fe329d0ad44d7d339e7073e6e82658de83be065450a358a449a

See more details on using hashes here.

File details

Details for the file django_html_validator-0.4.7-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for django_html_validator-0.4.7-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 98162c581e4b1f95e97fc7e03c64e5af08d4ba801d5d3a8e0e1d915383137fdb
MD5 0b555d7eb4d1f719d4f32b893a81a447
BLAKE2b-256 5868ef9ef5a02f3e853ef393dc6b1d54a63f5f77a65bc20ec59876122f5b1234

See more details on using hashes here.

File details

Details for the file django_html_validator-0.4.7-py2-none-any.whl.

File metadata

File hashes

Hashes for django_html_validator-0.4.7-py2-none-any.whl
Algorithm Hash digest
SHA256 f211679f47b5732c92f847b96a3f73f0dcb62b54dbcb0dd4706f11c2b7d7f7c0
MD5 73e924940b878fa830121ebf1a9c2183
BLAKE2b-256 c08067d9feae063af35af680cfcdf7feb2222bf07ea2b169676975a9ba47c672

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page