开发时静态文件「自己就能用」,上线后就不行了。这篇用真实的 gunicorn 把整个链条走一遍:谁提供文件、collectstatic 做了什么、WhiteNoise 加了什么、用了 Manifest 存储后忘了收集会怎样。
GET /static/app.css → 404
输出最后一行: 132 static files copied to STATIC_ROOT STATIC_ROOT 里的文件数: 132 其中来自自己的 static/: ['app.css', 'img.png'] 子目录: ['admin'] 不改文件再运行一次: 0 static files copied to STATIC_ROOT
collectstatic 只是把各处的静态文件收集到 STATIC_ROOT,第二次运行只复制有变化的文件。
collectstatic 之后没有中间件 → 404 加 WhiteNoiseMiddleware → 200 Content-Length 2837 Cache-Control: max-age=60, public Last-Modified 有: True
可以是 nginx、CDN,也可以是 WhiteNoise(这里用的方案)。我机器上没有 nginx,所以没有测 nginx 的配置。
没有 collectstatic,GET /page/ → 500 (模板渲染抛异常) 同样的模板在脚本里渲染 → ValueError: Missing staticfiles manifest entry for 'app.css' collectstatic 之后,GET /page/ → 200 <link href="/static/app.1fd618bb1a9a.css"> GET /static/app.1fd618bb1a9a.css → 200 Cache-Control: max-age=315360000, public, immutable CSS 里的 url() 被改写成: img.ca4e399d4a2a.png
WhiteNoise /static/app.css 0.457 ms FileResponse 视图 /dyn/ 0.409 ms
别指望 WhiteNoise 比 Django 视图快很多;它的价值是正确的缓存头、压缩与不用改代码。这里只测了单个小文件的串行请求。