Python中折腾django2.0发现静态文件获取有问题
环境:nginx 1.10.3 ,ubuntu 16.04, gunicorn 15.* ,django2.0
用刚刚初始化的工程跑了一边测试服务器没问题,就上了远程小鸡。发现我自己写了一个 index 方法通了(没用到静态文件),但是 x.x.x.x/admin 就 404. 判断是静态文件没能读取。
nginx 设置:
server {
listen 80;
server_name myhost.x.x.x;
location = /favicon.ico { access_log off; log_not_found off;}
location = /static {
alias /var/www/mypat/static;
}
location = /media {
alias /var/www/mypat/media;
}
location = / {
include proxy_params;
proxy_pass http://unix:/var/www/mypat/mypat.sock;
}
}
settings 设置:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = ‘/static/’
STATICFILES_DIRS = [
os.path.join(BASE_DIR, “static”),
]
看了 n 篇教程,设置千篇一律,不知道还有什么注意的地方,谢谢看题,感激不尽:)
Python中折腾django2.0发现静态文件获取有问题
你的 django app 叫 mypat 吗?
试一下把静态文件移到 /var/www/mypat/static/mypat/下面
这个问题我遇到过。Django 2.0 对静态文件处理确实有些变化,主要是 STATICFILES_DIRS 的配置和 static 模板标签的使用。核心问题通常是配置没写对或者 collectstatic 没跑。
直接上代码,这是最关键的 settings.py 配置部分:
# settings.py
import os
# 项目根目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 静态文件URL前缀
STATIC_URL = '/static/'
# 开发环境下的静态文件目录列表
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'), # 你的静态文件主目录
]
# 生产环境收集静态文件的目录(运行collectstatic后文件会放到这里)
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
然后在你的项目根目录下创建 static 文件夹,把 CSS、JS、图片这些放进去。比如:
your_project/
├── manage.py
├── static/
│ ├── css/
│ │ └── style.css
│ └── js/
│ └── app.js
└── your_app/
在模板里这么引用:
<!-- 在模板文件顶部加载static标签 -->
{% load static %}
<!-- 引用CSS -->
<link rel="stylesheet" href="{% static 'css/style.css' %}">
<!-- 引用JS -->
<script src="{% static 'js/app.js' %}"></script>
<!-- 引用图片 -->
<img src="{% static 'images/logo.png' %}" alt="Logo">
开发环境下,确保 DEBUG = True,Django 会自动处理静态文件。如果还是不行,检查一下 urls.py:
# 项目根目录的urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... 你的其他URL配置
]
# 开发环境下添加静态文件服务
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
最后,在命令行跑一下:
python manage.py collectstatic
这个命令会把所有 STATICFILES_DIRS 里的文件收集到 STATIC_ROOT 目录。开发时可能不需要,但检查一下没坏处。
主要就是配置路径要对,模板标签要用对。
settings 这么设置就报错了。
去掉 STATICFILES_DIRS
在生产环境执行一下,python manage.py collectstatic
这个命令会把 admin 用的静态文件从包里收集到 static 目录。
感谢回答,但是不起作用。
感谢回答,但是不起作用。
STATIC_ROOT 和 STATICFILES_DIRS 是不能相同的,runserver 时会有警告
collectstatic 会把 STATICFILES_DIRS 目录下及 admin 的静态文件拷贝到 STATIC_ROOT 目录,
检查一下 STATIC_ROOT 目录下有没有 admin 目录。
同 4#
STATICFILES_DIRS 用来存放公共静态资源文件;
STATIC_ROOT,是你执行 collectstatic 后,用来存放被集合的全部静态文件。
所以这俩目录不能相同,你要把 STATIC_ROOT 设置成 ‘static_cdn’ 或者 ‘static_collect’ 等目录名称。
早上没啥事,我专门写了篇文章,希望对你有所帮助:
https://www.lovchun.com/posts/how-to-handle-the-static-files-in-django.html
有目录,十分感谢
写的很详细,明白了这三个 STATIC 是什么作用.十分感谢
解决了,是在 nginx 那边配置出了问题 location = /static/ 这样少了个斜杠.
如果我少了斜杠,alias /path/to/my/static_xxx 是不起作用的,查看 404 的链接 http://my.ip.x.x/static/admin/xxx.css 也就是 staitc 路径根本没有解析出来。
还有个问题,根据你们的说法,static 中理论上不带 admin 我 collectstatic 一下,会把 admin 导入到 mysite/static 文件夹。那么我是不是可以不用设置 STATICFILES_DIR ,服务器静态文件直接指向 static.我试了下是可以的.
如果你整个 Project 里的任意 APP 静态资源文件,完全不考虑公共静态文件存放的话,你不设置 STATICFILES_DIR 肯定是可以的啊。
根据你自己 Project 需求来自定义都行。
我写那么细,只是详细介绍下 STATIC_URL STATICFILES_DIR STATIC_ROOT 三个配置项的意思。
因为我不太清楚你项目是小是大,具体要做什么。
settings 设置:
STATIC_ROOT = '/var/www/mypat/static’
STATIC_URL = ‘/static/’

