Django升级到4.2管理后台静态文件问题
我现在在用django 3.2,想尽快升级到4.2。在本地环境下,使用 python manage.py collectstatic
一切正常。但是,当我尝试把它部署到开发环境时,就出现问题了。
新的管理后台静态文件没有加载,导致django的管理页面看起来很糟糕。特别是,django 4.2引入了一个 dark_theme.css
的静态文件,在浏览器的网络选项卡中查看时会返回404错误。而在我的本地环境中,这个文件返回的是200 ok。
这是我在官方django论坛上找到的最相似的讨论,不过没有明确的解决方案(可能是因为导致这个问题的原因有很多)。
我在服务器上使用nginx。我们有一个CI流程,会运行 collectstatic
,然后把输出复制到一个docker容器里,我的nginx配置是用来获取静态文件的:
location /static/ {
autoindex on;
alias /usr/share/nginx/html/static/;
}
在django的设置中,我有这样的配置:
STATIC_ROOT = BASE_DIR / "ui/build/static"
STATIC_URL = "/static/"
这样静态文件会生成在 STATIC_ROOT
,然后docker容器会把它们正确地复制到 /usr/share/nginx/html/
。
我尝试了同样的过程,但在 collectstatic
命令中加了 --clear
参数,但还是没有成功。我也尝试过明确升级到django 4.2.0,因为有些人说这个版本有效,但依然没有效果。当然,我也尝试过刷新浏览器缓存。
不太确定还有什么其他原因,看起来静态文件是存在的(特别是 dark_theme.css
确实在正确的位置),但是从浏览器获取文件时却返回404。
如果有任何想法或者其他我可以尝试/检查的事情,非常感谢。
1 个回答
这个问题很常见,可能有很多原因导致。以下是我遇到的问题:
之前,Docker容器是这样构建的:
poetry run python manage.py collectstatic
npm install
npm run build
docker build ...
问题在于,npm构建的时候覆盖了静态文件,因为它们都在一个 /build/static
路径下。解决这个问题的方法是把这两个位置调换一下。不过仅仅这样做,问题还是存在,还需要在 collectstatic
命令后面加上 --clear
。
npm install
npm run build
poetry run python manage.py collectstatic --clear
docker build ...