折腾下 django2.0 发现静态文件获取有问题

2018-04-03 23:03:35 +08:00
 ihuzhou

环境: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 篇教程,设置千篇一律,不知道还有什么注意的地方,谢谢看题,感激不尽:)

2089 次点击
所在节点    Python
8 条回复
jerryshao
2018-04-03 23:10:13 +08:00
你的 django app 叫 mypat 吗?

试一下把静态文件移到 /var/www/mypat/static/mypat/下面
xpresslink
2018-04-03 23:11:41 +08:00
settings 这么设置就报错了。
去掉 STATICFILES_DIRS

在生产环境执行一下,python manage.py collectstatic
这个命令会把 admin 用的静态文件从包里收集到 static 目录。
ihuzhou
2018-04-03 23:27:57 +08:00
@jerryshao 感谢回答,但是不起作用。

@xpresslink 感谢回答,但是不起作用。
winix
2018-04-04 00:32:11 +08:00
STATIC_ROOT 和 STATICFILES_DIRS 是不能相同的,runserver 时会有警告

collectstatic 会把 STATICFILES_DIRS 目录下及 admin 的静态文件拷贝到 STATIC_ROOT 目录,
检查一下 STATIC_ROOT 目录下有没有 admin 目录。
passion336699
2018-04-04 10:31:11 +08:00
同 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
ihuzhou
2018-04-04 11:53:28 +08:00
@winix 有目录,十分感谢

@passion336699 写的很详细,明白了这三个 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.我试了下是可以的.
passion336699
2018-04-04 12:19:20 +08:00
@ihuzhou

如果你整个 Project 里的任意 APP 静态资源文件,完全不考虑公共静态文件存放的话,你不设置 STATICFILES_DIR 肯定是可以的啊。

根据你自己 Project 需求来自定义都行。

我写那么细,只是详细介绍下 STATIC_URL STATICFILES_DIR STATIC_ROOT 三个配置项的意思。

因为我不太清楚你项目是小是大,具体要做什么。
twor
2018-04-04 16:32:49 +08:00
settings 设置:

STATIC_ROOT = '/var/www/mypat/static'
STATIC_URL = '/static/'

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/444118

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX