Minify HTML output from Flask application with Jinja2 templates

前端 未结 7 938
鱼传尺愫
鱼传尺愫 2021-02-02 11:24

Is there a Flask or Jinja2 configuration flag / extension to automatically minify the HTML output after rendering the template?

相关标签:
7条回答
  • 2021-02-02 11:32

    Modifying @Bletch answer for the latest version of htmlmin.

    from flask import Flask
    import htmlmin
    
    app = Flask(__name__)
    
    @app.route('/')
    def home():
        rendered_html = render_template('home.html')
        return htmlmin.minify(rendered_html)
    

    https://htmlmin.readthedocs.io/en/latest/quickstart.html

    The minified html will still have some spaces between the tags. If we want to remove that, then remove_empty_space =True attribute needs to be added while the template is rendered.

    return htmlmin.minify(rendered_html, remove_empty_space =True)
    

    https://htmlmin.readthedocs.io/en/latest/reference.html

    0 讨论(0)
  • 2021-02-02 11:38

    Use the decorator.

    from htmlmin.decorator import htmlmin
    
    @htmlmin
    def home():
    ...
    

    Or you can just use:

    re.sub(r'>\s+<', '><', '<tag>   </tag>') # results '<tag></tag>'
    
    0 讨论(0)
  • 2021-02-02 11:45

    Found a better way to do this. You can minify all your pages with this method:

    from flask import Flask
    from htmlmin.main import minify
    
    app = Flask(__name__)
    
    
    @app.after_request
    def response_minify(response):
        """
        minify html response to decrease site traffic
        """
        if response.content_type == u'text/html; charset=utf-8':
            response.set_data(
                minify(response.get_data(as_text=True))
            )
    
            return response
        return response
    
    0 讨论(0)
  • 2021-02-02 11:52

    I use the following decorators

    import bs4
    import functools
    import htmlmin
    
    
    def prettify(route_function):
        @functools.wraps(route_function)
        def wrapped(*args, **kwargs):
            yielded_html = route_function(*args, **kwargs)
            soup = bs4.BeautifulSoup(yielded_html, 'html.parser')
            return soup.prettify()
    
        return wrapped
    
    def uglify(route_function):
        @functools.wraps(route_function)
        def wrapped(*args, **kwargs):
            yielded_html = route_function(*args, **kwargs)
            minified_html = htmlmin.minify(yielded_html)
            return minified_html
    
        return wrapped
    

    And simply wrapped the default render_template function like so

    if app.debug:
        flask.render_template = prettify(flask.render_template)
    else:
        flask.render_template = uglify(flask.render_template)
    

    This has the added benefit of being auto added to the cache, since we don't actually touch app.route

    0 讨论(0)
  • 2021-02-02 11:53

    I've written a flask extension to achieve that purpose. You can install it using pip install flask-htmlmin and the source is available at https://github.com/hamidfzm/Flask-HTMLmin . Hope it will be useful.

    0 讨论(0)
  • 2021-02-02 11:54

    Have a look here https://github.com/cobrateam/django-htmlmin#using-the-html_minify-function

    I realise it is mainly used for django but the example shows how to use this projects code to do what you want with a flask view, i think.

    0 讨论(0)
提交回复
热议问题