Django升级到4.2管理后台静态文件问题

0 投票
1 回答
55 浏览
提问于 2025-04-14 16:19

我现在在用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 个回答

0

这个问题很常见,可能有很多原因导致。以下是我遇到的问题:

之前,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 ...

撰写回答