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发现静态文件获取有问题

9 回复

你的 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/’

回到顶部