Django v1.11静态文件URL、ROOT、DIR配置困惑求助
嘿,我来帮你一步步排查这个问题!你已经完成了collectstatic,文件也成功从static_dir复制到static_root,但CSS没按预期加载,咱们从最常见的原因开始检查:
检查DEBUG模式状态
Django在DEBUG=True时,默认会直接从STATICFILES_DIRS(也就是你的static_dir)读取静态文件,完全不会用到STATIC_ROOT。这是开发模式下的默认行为,目的是方便你修改静态文件后实时看到效果。如果你的settings.py里DEBUG还是True,那这就是问题所在!- 要是你在测试生产环境的静态文件加载,把
DEBUG改成False试试; - 要是还在开发阶段,其实没必要用
collectstatic,直接用static_dir里的文件就行。
- 要是你在测试生产环境的静态文件加载,把
确认模板里的静态文件引用方式
你必须用Django的模板标签来引用静态文件,不能直接写死路径。比如:{% load static %} <link rel="stylesheet" href="{% static 'css/your-style.css' %}">如果直接写
<link href="/static/css/your-style.css">,虽然看起来路径对,但当STATIC_URL或者部署路径变化时会出错,而且Django也无法正确映射到STATIC_ROOT的文件。检查STATIC_ROOT的文件权限
有时候collectstatic复制过去的文件权限不足,导致web服务器(比如Nginx、Apache)无法读取。你可以在服务器上执行命令查看权限:ls -l /path/to/your/project/e/static/static_root/css/确保文件夹权限是
755,文件权限是644左右,让服务器进程有读取权限。配置web服务器的静态文件路由(生产环境)
如果已经部署到生产环境,光靠Django是不够的,必须让web服务器直接处理静态文件请求。比如用Nginx的话,要在配置文件里加:location /static/ { alias /path/to/your/project/e/static/static_root/; expires 30d; }注意
alias后面的路径要加末尾的斜杠,不然会导致路径拼接错误。配置完后记得重启web服务器。清除浏览器缓存
有时候浏览器会缓存旧的静态文件请求,就算你配置对了,它还是加载缓存里的内容。试试按Ctrl+F5强制刷新页面,或者用无痕模式打开网站测试。
内容的提问来源于stack exchange,提问作者Yunus

