Html minification middleware with (but not only) django support and good
Django (2.0+) oriented HTML minification function and middleware (another one).
Key feature — speed. 10x (on large html's it can be 50x, 100x, 200x or even more) time faster, than htmlmin.
Compress html code and removes html comments, but ignores conditional comments (IE) by default.
Uses cache by default (can be disabled), so minification overhead is greatly reduced.
Also it can be used as solo function.
For best expirience use it with https://github.com/django-compressor/django-compressor.
Written in modern python 3.7+ with fully typing-covered codebase.
Full support of:
- Python 3.7+
- Django 2.0+ (not required)
For install django-hmin, run on terminal:
$ pip install django-hmin
If there is no release, or you dont want/cant use pypi, then:
git clonethis repo
pipenv installto install requirements or just
pip install flit
flit installYes, we dont use classic
setup.py, we use flit +
pyproject.toml. Go bless PEP-518 + PEP-621.
Using with Django as midleware
All you need to do is add two middlewares to your
MIDDLEWARE_CLASSES: tuple = ( # other middleware classes 'hmin.middleware.MinMiddleware', 'hmin.middleware.MarkMiddleware', )
If you're using Django's caching middleware,
should go after
should go after
MIDDLEWARE_CLASSES: tuple = ( 'django.middleware.cache.UpdateCacheMiddleware', 'hmin.middleware.MinMiddleware', # other middleware classes 'django.middleware.cache.FetchFromCacheMiddleware', 'hmin.middleware.MarkMiddleware', )
You can optionally specify the
HTML_MINIFY: bool = True
The default value for the
HTML_MINIFY setting is
not DEBUG. You only
need to set it to
True if you want to minify your HTML code when
HMIN_EXCLUDE: tuple = ('^base/', '^admin/')
Keep HTML comments
HMIN_REMOVE_COMMENTS: bool = False
By default hmin middleware uses cache via django caches framework (very useful for small and middle web sites, and for big you definitely will use ngx_pagespeed or other "big" solutions). You can disable it by specify setting:
HMIN_USE_CACHE: bool = False
Also you can change time and cache backend (if you want, by default time is 3600, cache backend — "default"):
HMIN_CACHE_TIMEOUT: int = 86400 HMIN_CACHE_BACKEND: str = 'my_cache'
More using scenarios
Just import decorator minify_plain:
from hmin.decorators import minify_plain, than you can minify any function you want:
@minify_plain() def my_cool_func(): <...> return some_plain_html
Or, if you want to keep html comments:
@minify_plain(False) def my_cool_func(): <...> return some_plain_html
Just import function minify. Function definition:
def minify(content, remove_comments=True). Example:
from hmin import html_minify html_minify('<div> hello</div>') # <div>hello</div>
$ python -m hmin filename.html > filename.min.html
I try to compress 1.1mb of very dense html on my i7 laptop processor (2020 edition!) and measure raw time with chrome inspector.
I got following data (this data comes from field "Waiting (TTFB)", not "Content Download"):
- htmlmin took about 2.5 seconds!
- this package took:
- ~100ms (verion 0.5.2)
- ~60ms (version 0.5.3) — i fixed some bug in regexp, now package doesnt strip spaces BEFORE open tag, cause it was incorrect behaviour. So, now speed is like previous version. Yes! :)
As you can see, hmin 0.5+ are slightly slower than 0.3, but this is comes from updated minifcation logic. In previous version minification was not so accurate, as i think. But, hmin still very much faster.
Maybe in the next releases i made some experiments with cython or numba to improve speed.
Old data (version < 0.5)
Stupid speed benchmark (1)
I try to compress 1mb of html (i think, your usual html is slightly thiner) on my i7 laptop processor and measure time with django-debug-toolbar.
Django overhead took about 40ms (all), this is time without minification, just plain html, django, etc.
Then i install hmin and htmlmin and just look at the debug toolbar numbers (this is very silly and simple "benchmark"):
- with hmin cpu was about 60ms (min)
- with htmlmin cpu was about 1200ms (min)
Minus overhead, plain time: hmin — 20ms, htmlmin — 1160ms.
Probably, you can get other numbers. But hmin really faster than htmlmin.
Stupid speed benchmark (2)
Also i try to compress 2mb of html on my desktop i3 (sandy bridge).
Debug toolbar time:
- with hmin cpu was about 220ms without cache, and 87ms with cache
- with htmlmin cpu was about 125000ms
Django overhead was about 80ms.
Minus overhead, plain time: hmin — 140ms (7ms with cache), htmlmin — ok.
You can check https://github.com/xfenix/django-hmin/releases release page.
Current possible problems
- Doesnt respect CDATA
Release history Release notifications | RSS feed
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
|Filename, size||File type||Python version||Upload date||Hashes|
|Filename, size django_hmin-0.5.3-py3-none-any.whl (454.0 kB)||File type Wheel||Python version py3||Upload date||Hashes View|
|Filename, size django-hmin-0.5.3.tar.gz (451.7 kB)||File type Source||Python version None||Upload date||Hashes View|
Hashes for django_hmin-0.5.3-py3-none-any.whl