Миниатюрный вывод HTML из приложения Flask с шаблонами Jinja2 - программирование
Подтвердить что ты не робот

Миниатюрный вывод HTML из приложения Flask с шаблонами Jinja2

Есть ли флажок или расширение конфигурации Flask или Jinja2 для автоматического минимизации вывода HTML после визуализации шаблона?

4b9b3361

Ответ 1

Посмотрите здесь https://github.com/cobrateam/django-htmlmin#using-the-html_minify-function

Я понимаю, что он используется в основном для django, но пример показывает, как использовать этот код проекта для того, чтобы делать то, что вы хотите, с флеш-представлением, я думаю.

Ответ 2

Найден лучший способ сделать это. Вы можете минимизировать все ваши страницы с помощью этого метода:

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

Ответ 3

Используйте декоратор.

from htmlmin.decorator import htmlmin

@htmlmin
def home():
...

Или вы можете просто использовать:

re.sub(r'>\s+<', '><', '<tag>   </tag>') # results '<tag></tag>'

Ответ 4

Я написал расширение колбы для достижения этой цели. Вы можете установить его с помощью pip install flask-htmlmin, и источник доступен в https://github.com/hamidfzm/Flask-HTMLmin. Надеюсь, это будет полезно.

Ответ 5

Я использую следующие декораторы

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

И просто обернута функция render_template по умолчанию так:

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

Это добавило преимущества автоматического добавления в кеш, поскольку мы фактически не нажимаем app.route

Ответ 6

Чтобы расширить полезность ответа от @olly_uk и комментария @Alexander, похоже, что расширение django-htmlmin теперь спроектировано для использования с каркасами, отличными от Django.

В документах здесь вы можете вручную использовать функцию html_minify в представлениях Flask, например:

from flask import Flask
from htmlmin.minify import html_minify

app = Flask(__name__)

@app.route('/')
def home():
    rendered_html = render_template('home.html')
    return html_minify(rendered_html)

Ответ 7

Изменение ответа @Bletch для последней версии 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

Минимизированный HTML все еще будет иметь несколько пробелов между тегами. Если мы хотим удалить это, тогда необходимо remove_empty_space =True атрибут remove_empty_space =True во время визуализации шаблона.

return htmlmin.minify(rendered_html, remove_empty_space =True)