在django中使用whitenoise管理静态资源

5
(1)

根据django文档,在debug模式下,web服务可以托管静态资源(css,js,png,jpg…),但是在生产环境下就要使用第三方服务了,比如apache,nginx, IIS等。同时django也提供了命令行工具将静态资源收集到同一个目录,再使用nginx等工具托管此静态目录,但是仍然存在浏览器缓存的问题。常见的解决方案是使用webpack等工具在打包发布时,将静态资源的文件名增加一个检验码做后缀,比如 main.js打包后变成了main.3e230fdf.js。

whitenoise(https://pypi.org/project/whitenoise/)就是一个用来管理python web项目静态资源的工具。并且支持WSGI兼容的应用, 在django中使用时,支持自动配置的特性。

以下是whitenoise的主要版本需求,详情请参考官方文档中(https://whitenoise.readthedocs.io/en/latest/changelog.html):

whitenoise版本python版本django版本
6.10.0支持3.1.4
6.9.0支持5.2
6.8.0支持3.1.3 / 移除3.8移除3.2-4.1
6.7.0支持5.1
6.6.0移除3.7支持5.0
6.5.0支持python3.12
6.4.0支持4.2
6.2.0支持python3.11支持4.1
6.1.0移除2.2/3.0/3.1
6.0.0支持3.9,3.10、 移除3.5,3.6移除1.11/2.0/2.1、支持4.0

安装

pip install whitenoise

在django中的配置,编辑settings.py文件,将whitenoise添加到MIDDLEWARE列表中,位置是SecurityMiddleware之后

MIDDLEWARE = [
    # ...
    "django.middleware.security.SecurityMiddleware",
    "whitenoise.middleware.WhiteNoiseMiddleware",
    # ...
]

如果需要支持缓存和压缩,在settings.py中添加

STORAGES = {
    # ...
    "staticfiles": {
        "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
    },
}

还要记得在settings.py中配置静态资源目录:

STATIC_ROOT = BASE_DIR / "staticfiles"

完成以上配置后,在发布django应用的生产环境时,不需要单独使用nginx等工具托管静态资源,只需要执行收集资源的命令,whitenoise会托管STATIC_ROOT中配置的静态资源文件

python manage.py collectstatic

但是,在开发环境下,静态资源仍然被django托管,会导致开发环境和生产环境下的结果不同,那么还需要在settings.py中增加以下配置,在开发环境下也使用whitenoise托管静态资源,无需执行收集静态资源的命令

INSTALLED_APPS = [
    # ...
    "whitenoise.runserver_nostatic",
    "django.contrib.staticfiles",
    # ...
]

whitenoise还有更多关于django的细节配置参数,参考文档:https://whitenoise.readthedocs.io/en/latest/django.html

2025/9/10 北京,上东廓

这篇文章有用吗?

点击星号为它评分!

平均评分 5 / 5. 投票数: 1

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注