This middleware implements compressed content encoding for HTTP. It is similar
documentation_), but additionally supports
other compression methods. It is meant to be a drop-in replacement for Django's
GZipMiddleware. Its documentation — including security warnings — therefore
apply here as well.
The middleware is focussed on the task of compressing typical Django responses
such as HTML, JSON, etc. Both normal (bulk) and streaming responses are
supported. For static file compression, have a look at other projects such as
Zstandard is a new method for compression with little client support so far.
Most browsers now support Brotli compression (check support status on
Can I use... Brotli_). The middleware will choose the best compression method
supported by the client as indicated in the request's
header. In order of preference:
Summary of the project status:
Can I use... Brotli: http://caniuse.com/#search=brotli
The following requirements are supported and tested in all reasonable combinations:
.. code:: shell
pip install --upgrade django-compression-middleware
To apply compression to all the views served by Django, add
compression_middleware.middleware.CompressionMiddleware to the
.. code:: python
MIDDLEWARE = [ # ... 'compression_middleware.middleware.CompressionMiddleware', # ... ]
BrotliMiddleware if you used it before.
Consult the Django documentation on the correct
ordering of middleware_.
ordering of middleware: https://docs.djangoproject.com/en/dev/ref/middleware/#module-django.middleware.gzip
Alternatively you can decorate views individually to serve them with compression:
.. code:: python
from compression_middleware.decorators import compress_page @compress_page def index_view(request): ...
Note that your browser might not send the
br entry in the
header when you test without HTTPS (common on localhost). You can force it to
send the header, though. In Firefox, visit
about:config and set
network.http.accept-encoding to indicate support. Note that you might
encounter some problems on the web with such a setting (which is why Brotli is
only supported on secure connections by default).
The code and tests in this project are based on Django's
django-brotli. For compression, it uses the following modules
to bind to fast C modules:
zstandard_ bindings. It supports both a C module (for CPython) and CFFI which should be appropriate for PyPy. See the documentation for full details.
Brotli_ bindings or
brotlipy_. The latter is preferred on PyPy since it is implemented using cffi. But both should work on both Python implementations.
Further readding on Wikipedia:
HTTP compression <https://en.wikipedia.org/wiki/HTTP_compression>__
git clone ...)
pip install --upgrade -r requirements_dev.txt
pytest, and afterwards preferably
toxto test the full test matrix. Consider installing as many supported interpreters as possible (having them in your
PATHis often sufficient).
The MPL 2.0 License
Copyright (c) 2019
Friedel Wolff <https://fwolff.net.za/>_.