Django Admin 样式表不会加载到生产服务器上

Posted

技术标签:

【中文标题】Django Admin 样式表不会加载到生产服务器上【英文标题】:Django Admin stylesheets won't load on production server 【发布时间】:2015-04-13 14:50:38 【问题描述】:

运行 Django 1.6 的生产服务器上没有加载 Django 的内置管理站点样式表。我可以看到许多其他人都遇到了这个问题,并且我已经尝试了所有提供给他们的解决方案,但都没有奏效。我的 Django 站点在 nginx v. 1.2.1 代理后面的 Gunicorn 19.1.1 之上运行。

由于我要构建一个仪表板,并且将使用管理站点来管理我的用户、组和模型,因此我在我的站点中创建了一个“管理”应用程序:

INSTALLED_APPS += ('apps.admin', )

我正在覆盖和扩展 Django 的一些管理模板,并在此处从 django.contrib.admin.templates 复制它们:

/www/site/apps/admin/__init__.py
/www/site/apps/admin/models.py
/www/site/apps/admin/views.py
/www/site/apps/admin/urls.py
/www/example/apps/admin/templates/admin/base.html
/www/example/apps/admin/templates/admin/base_site.html
/www/example/apps/admin/templates/admin/index.html
/www/example/apps/admin/templates/admin/my_dashboard.html # mine

这里是我的 urls.py 文件中的相关设置

from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
    # ...
    url(r'^admin/', include(admin.site.urls)),
    url(r'^admin/dashboard/$',
        'apps.admin.views.dashboard',
        'template': 'my_dashboard.html',
        name='dashboard'),
)

这是我的设置。我网站的实际静态文件位于此处:

/www/example/static/css
/www/example/static/js

这是我的静态根目录。 Django 文档说它应该不同于你的静态文件的实际位置。

STATIC_ROOT = "/var/www/example/static/"

我的静态 URL 的前缀:

STATIC_URL = '/static/'

静态文件和查找器的位置:

STATICFILES_DIRS = (
    '/www/example/static'
)
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

我的 Nginx 配置文件:

upstream gunicorn 
    server 127.0.0.1:8000 fail_timeout=0;

server 
    listen 80;
    server_name www.example.com;
    rewrite ^/(.*) http://example.com/$1 permanent;

server 
    listen 80;
    server_name example.com;
    root /www/example;
    client_max_body_size 4G;
    keepalive_timeout 5;
    location /static/ 
        alias /www/example/static/;
    
    location /media/ 
        alias /var/www/example/media/;
    
    try_files $uri @django;
    location @django 
        proxy_pass http://gunicorn;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    error_page 500 502 503 504 /500.html;
    location = /500.html 
        root /www/example/static;
    

我可以看到该站点正确地为我的静态文件提供服务器。例如我可以看到这张图片:

http://example.com/static/img/small_img.jpg

但是当我尝试访问 Django 样式表时,Nginx 会引发 404 错误...

http://example.com/static/admin/css/base.css

...即使在我的浏览器中查看源代码会显示这些链接:

<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css" />
<link rel="stylesheet" type="text/css" href="/static/admin/css/login.css" />

以下是我做过的其他事情:

我确认“django.contrib.staticfiles”和“django.contrib.admin”在 INSTALLED_APPS 中。 我进入 Python shell 并验证了我的 STATIC_ROOT、STATIC_URL 和 STATICFILES_DIR 设置。 我在我的服务器上运行了“collectstatic”命令并验证它是否将 Django 管理站点的静态文件复制到了我的 STATIC_ROOT。 我尝试按照here 的描述在我的 nginx 配置文件中添加一个额外的位置指令并重新启动我的 Nginx 服务。 我尝试在我的虚拟环境目录中创建一个目录 /www/example/static/admin 目录,然后在其中创建一个指向静态目录 .../django/contrib/admin/static/ 的“静态”符号链接. 我在 Chrome 中加载了管理员主页,开发者控制台可见,看看是否发生了奇怪的事情,但它只报告了 404 错误。

我将通过将 Django 的静态文件复制到我网站的静态文件目录并更改我的 base.html 版本中的 href 来尝试“猴子修补”。但是,这不是一个好的解决方案。

很抱歉发了这么长的帖子。谁能告诉我我做错了什么?除此之外,管理站点似乎正在运行。这只是不加载的样式表。谢谢!

【问题讨论】:

这可能是/www/example/static/ 的权限问题吗?编辑:看起来您的 STATIC_ROOT 与 nginx 的 location /static/ 别名不匹配。你错过了/var/ 就是这样!我只是需要一双额外的眼睛。如果您想重新发布您的评论作为答案,我很乐意给予您信任。希望其他人至少会发现这很有用,因为他们可以采取一组步骤来解决此类问题。再次感谢。 【参考方案1】:

您的 STATIC_ROOT 看起来与 nginx 的 location /static/ 别名不匹配。你错过了/var/

【讨论】:

以上是关于Django Admin 样式表不会加载到生产服务器上的主要内容,如果未能解决你的问题,请参考以下文章

django无法加载出css样式,不管是admin还是自己创建的html都无法加载

Python解决Django Admin管理界面样式表(CSS Style)丢失问题

(转) 解决django项目部署到nginx+uwsgi服务器后 admin页面样式消失的问题

django的admin界面怎么没有样式

Django Admin 在生产 Heroku 中引发 500 错误

尝试从 django 中的子模板加载 css 样式表