根据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 北京,上东廓