跳转到主要内容

使用minify-html,一个极快的HTML + JS + CSS压缩器,与Django一起使用。

项目描述

https://img.shields.io/github/actions/workflow/status/adamchainz/django-minify-html/main.yml.svg?branch=main&style=for-the-badge https://img.shields.io/badge/Coverage-100%25-success?style=for-the-badge https://img.shields.io/pypi/v/django-minify-html.svg?style=for-the-badge https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge pre-commit

使用minify-html,一个极快的HTML + JS + CSS压缩器,与Django一起使用。


更聪明、更快速地工作,我的书提升您的Django开发体验涵盖了提高您开发体验的许多方法。


要求

支持Python 3.8到3.12。

支持Django 3.2到5.1。

安装

  1. 使用

    pip

    安装

    python -m pip install django-minify-html
  2. 将django-minify-html添加到您的INSTALLED_APPS

    INSTALLED_APPS = [
        ...,
        "django_minify_html",
        ...,
    ]
  3. 添加中间件

    MIDDLEWARE = [
        ...,
        "django_minify_html.middleware.MinifyHtmlMiddleware",
        ...,
    ]

    该中间件应该位于可能对您的响应进行编码的其他中间件之下,例如Django的GZipMiddleware。它应该在可能修改您的HTML的其他中间件之上,例如django-debug-toolbardjango-browser-reload

参考

有关 minify-html 的信息,请参阅其文档

django_minify_html.middleware.MinifyHtmlMiddleware

该中间件在 HTML 响应的内容上运行 minify_html.minify()。此函数会最小化 HTML,以及任何内联 JavaScript 和 CSS。

中间件将从其 minify_args 属性传递关键字参数给 minify(),这是一个名称到值的字典。这些对应于 Rust 库中的 Cfg 结构体 的值,在 Python 库的源代码中可见 (如所示)。默认情况下,中间件将 minify_cssminify_js 覆盖为 True。如果您需要更改参数,则可以创建中间件的子类,替换 minify_args,并使用您的子类。例如,要在压缩后保留注释

from django_minify_html.middleware import MinifyHtmlMiddleware


class ProjectMinifyHtmlMiddleware(MinifyHtmlMiddleware):
    minify_args = MinifyHtmlMiddleware.minify_args | {
        "keep_comments": True,
    }

(此示例使用 Python 3.9 的 字典合并运算符。)

中间件适用于所有非流式、非编码的 HTML 响应。您可以使用下面的 @no_html_minification 装饰器在单独的视图中跳过它。

为了更广泛地限制它,您可以使用具有覆盖 should_minify() 方法的子类。此方法接受 requestresponse,并返回一个 bool。例如,避免对具有 URL 前缀 /admin/ 的 URL 进行压缩

from django.http import HttpRequest, HttpResponse

from django_minify_html.middleware import MinifyHtmlMiddleware


class ProjectMinifyHtmlMiddleware(MinifyHtmlMiddleware):
    def should_minify(self, request: HttpRequest, response: HttpResponse) -> bool:
        return super().should_minify(request, response) and not request.path.startswith(
            "/admin/"
        )

请注意,即使 DEBUGTrue,响应也会被压缩。这建议这样做,因为 HTML 压缩可以揭示模板中的错误,因此最好始终以生产环境中显示的 HTML 形式工作。压缩后的 HTML 很难阅读“查看源代码” - 最好依赖于浏览器开发者工具中的检查器。

django_minify_html.decorators.no_html_minification

将此装饰器应用于您想跳过 HTML 压缩的视图。

from django.shortcuts import render

from django_minify_html.decorators import no_html_minification


@no_html_minification
def example_view(request):
    return render(request, "problematic-template.html")

动机

HTML 压缩是网络优化的一个被低估的技术。它可以在其他工具(如 Brotli 或 Gzip 的压缩)之上带来显著的节省。

在 Django 中已经有一个用于 HTML 压缩的现有包 django-htmlmin。但它要慢得多,因为它在 Python 中进行压缩。截至编写本文时,它也不再维护,自 2019 年 3 月以来没有发布。

还有其他压缩器,但在基准测试中 minify-html 超过了它们。这是一个真正经过优化和测试的 Rust 库,似乎是最佳的 HTML 压缩器。

历史上,Cloudflare 提供了自动压缩(2024 年 8 月已删除)。这对于 CDN 层来说很方便,因为它不需要应用程序更改。但它添加了一些开销:未压缩的 HTML 首先需要传输到 CDN,然后 CDN 需要解析响应,并将其重新组合。这也意味着您只有在代码上线后才能看到压缩的潜在副作用。总的来说,在 Django 中在 HTML 生成时压缩应该更快且更可预测。

项目详细信息


下载文件

下载您平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。

源分布

django_minify_html-1.9.0.tar.gz (10.1 kB 查看哈希值)

上传时间

构建分布

django_minify_html-1.9.0-py3-none-any.whl (7.0 kB 查看哈希值)

上传时间 Python 3

由以下支持