Django Admin 样式表不会在生产服务器上加载
Django Admin stylesheets won't load on production server
我的运行 Django 1.6 的生产服务器上未加载 Django 的内置管理站点样式表。我可以看到很多其他人遇到过这个问题,我已经尝试了所有提供给他们的解决方案,但 none 有效。我的 Django 站点在 Gunicorn 19.1.1 之上运行,在 Nginx v.1.2.1 代理之后。
由于我将要构建一个仪表板,并且将使用管理站点来管理我的用户、组和模型,因此我在我的站点中创建了一个 "admin" 应用程序:
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/ 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 目录,然后在其中创建指向静态目录的 "static" 符号链接 .../django/contrib/admin/static/ 在我的虚拟环境目录中。
- 我在 Chrome 中加载了管理主页,开发者控制台可见,以查看是否发生了 st运行ge 问题,但它只报告了 404 错误。
我打算通过将 Django 的静态文件复制到我站点的静态文件目录并更改我的 base.html 版本中的 href 来尝试 "monkey patching"。但是,这不是一个好的解决方案。
抱歉拖了这么久post。谁能告诉我我做错了什么?除此之外,管理站点似乎可以正常工作。它只是不加载的样式表。谢谢!
您的 STATIC_ROOT
似乎与 nginx 的 location /static/
别名不匹配。你错过了 /var/
我的运行 Django 1.6 的生产服务器上未加载 Django 的内置管理站点样式表。我可以看到很多其他人遇到过这个问题,我已经尝试了所有提供给他们的解决方案,但 none 有效。我的 Django 站点在 Gunicorn 19.1.1 之上运行,在 Nginx v.1.2.1 代理之后。
由于我将要构建一个仪表板,并且将使用管理站点来管理我的用户、组和模型,因此我在我的站点中创建了一个 "admin" 应用程序:
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/ 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 目录,然后在其中创建指向静态目录的 "static" 符号链接 .../django/contrib/admin/static/ 在我的虚拟环境目录中。
- 我在 Chrome 中加载了管理主页,开发者控制台可见,以查看是否发生了 st运行ge 问题,但它只报告了 404 错误。
我打算通过将 Django 的静态文件复制到我站点的静态文件目录并更改我的 base.html 版本中的 href 来尝试 "monkey patching"。但是,这不是一个好的解决方案。
抱歉拖了这么久post。谁能告诉我我做错了什么?除此之外,管理站点似乎可以正常工作。它只是不加载的样式表。谢谢!
您的 STATIC_ROOT
似乎与 nginx 的 location /static/
别名不匹配。你错过了 /var/