【问题标题】:Django admin panel won't render CSSDjango 管理面板不会呈现 CSS
【发布时间】:2019-08-12 21:29:26
【问题描述】:

我遵循了多个指南并阅读了有关此问题的许多其他答案(例如:hereherehereherehere 等),但它们都没有帮助。

使用 nginx 1.15.5、Django 2.2.1、gunicorn 19.9.0、Python 3.6

现在,我的 Django 管理面板如下所示:


nginx.conf


error_log logs/error.log warn;

events { }
http {
    access_log logs/access.log combined;
    include default-site.conf;
    include myapp.conf;
}

myapp.conf


server {
# http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log
access_log logs/myapp/access.log combined;

server_name  myserver.com;
listen       1234;

# ignore favion messages
location = /favicon.ico { access_log off; log_not_found off; }

# path to socket for gunicorn
location / {
        proxy_pass http://unix:/usr/local/bin/apps/myapp/myapp.sock;
}

# location for static files to serve; mostly the admin panel CSS files
location /static/ {
        root /usr/local/bin/apps/myapp/;
}

}

Gunicorn 守护进程启动命令(在myapp 项目目录内):

gunicorn webapp.wsgi \
--bind "unix:/usr/local/bin/apps/myapp/myapp.sock" \
--config "../server-conf/myserver.com/myapp/gunicorn_config.py" \
--pid "logs/gunicorn.pid" \
--access-logfile "logs/gunicorn.access.log" \
--error-logfile "logs/gunicorn.error.log" \
--log-file "logs/gunicorn.log" \
--name "gunicorn-myapp" \
--daemon

姜戈settings.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

我已经跑过python manage.py collectstatic。文件在那里,并且具有全局读取权限:

$ ll /usr/local/bin/apps/myapp/static/
total 12K
drwxrwsr-x.  3 myusername myusergroup 4.0K Mar 21 14:57 .
drwxrwsr-x. 10 myusername myusergroup 4.0K Mar 21 17:06 ..
drwxrwsr-x.  6 myusername myusergroup 4.0K Mar 21 14:57 admin

$ ll /usr/local/bin/apps/myapp/static/admin/
total 24K
drwxrwsr-x. 6 myusername myusergroup 4.0K Mar 21 14:57 .
drwxrwsr-x. 3 myusername myusergroup 4.0K Mar 21 14:57 ..
drwxrwsr-x. 3 myusername myusergroup 4.0K Mar 21 14:57 css
drwxrwsr-x. 2 myusername myusergroup 4.0K Mar 21 14:57 fonts
drwxrwsr-x. 3 myusername myusergroup 4.0K Mar 21 14:57 img
drwxrwsr-x. 4 myusername myusergroup 4.0K Mar 21 14:57 js

最令人困惑的部分是,CSS 文件已被 nginx 成功切断。当我导航到myserver.com:1234/static/admin/css/base.css 时,我可以在浏览器中看到它们的内容:

在我的 nginx 日志中,当我尝试访问管理页面时看到这样的消息:

100.100.100.100 - - [21/Mar/2019:18:32:50 -0400] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1819 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"

当我直接访问 CSS 文件时:

100.100.100.100 - - [21/Mar/2019:18:32:52 -0400] "GET /static/admin/css/base.css HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"

我不确定为什么它会给出 304 状态码,但没有错误。我能够访问静态 Admin CSS 文件,因此看来该文件正在正确提供(?)。除了这个,应用程序的所有其他部分都在工作。你知道发生了什么吗?为什么 CSS 文件无法正确呈现在页面中?

【问题讨论】:

    标签: python css django nginx


    【解决方案1】:

    原来我需要在我的 nginx conf 中包含 /etc/nginx/mime.types 文件;

    error_log logs/error.log warn;
    
    events { }
    http {
        access_log logs/access.log combined;
        include myapp.conf;
        include mime.types;
    }
    

    我猜这是因为我在非标准目录位置以空白 nginx.conf 开头。

    将此行添加到我的 conf 并重新启动服务器几次后,现在 .css 文件已正确呈现。

    作为参考,打开 Chrome 开发人员工具的网络选项卡并查看页面上的 css 文件条目很有帮助,以前它们以“Content-Type: text/plain”的形式出现,现在他们应该以“Content-Type:text/css”的形式到达。

    此外,我尝试在我的应用 (myapp.conf) 的配置下完全禁用缓存:

    location /static/ {
            expires -1;
            root /usr/local/bin/apps/myapp/;
        }
    

    这似乎有助于将浏览器中的 HTTP 代码从 304 变为 200。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多