V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ihuzhou
V2EX  ›  Python

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

  •  
  •   ihuzhou · 2018-04-03 23:03:35 +08:00 · 2095 次点击
    这是一个创建于 2425 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2018-04-04 01:15:20 +08:00
    看了下错误日志,地址被解析到如下的位置:/usr/share/nginx/html/admin/index.html .看来错误是出在这了,这就很奇怪了,ಥ_ಥ. 也就是我设置的 location 完全没用.
    8 条回复    2018-04-04 16:32:49 +08:00
    jerryshao
        1
    jerryshao  
       2018-04-03 23:10:13 +08:00
    你的 django app 叫 mypat 吗?

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

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

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

    collectstatic 会把 STATICFILES_DIRS 目录下及 admin 的静态文件拷贝到 STATIC_ROOT 目录,
    检查一下 STATIC_ROOT 目录下有没有 admin 目录。
    passion336699
        5
    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
        6
    ihuzhou  
    OP
       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
        7
    passion336699  
       2018-04-04 12:19:20 +08:00
    @ihuzhou

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

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

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

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

    STATIC_ROOT = '/var/www/mypat/static'
    STATIC_URL = '/static/'
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2588 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:21 · PVG 23:21 · LAX 07:21 · JFK 10:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.