Таблицы стилей администратора Django не загружаются на рабочий сервер

Таблицы стилей Django для встроенного сайта администратора не загружаются на мой рабочий сервер, на котором работает Django 1.6. Я вижу, что многие другие люди сталкивались с этой проблемой, и я пробовал все решения, которые были им предоставлены, но ни одно из них не работает. Мой сайт Django работает поверх Gunicorn 19.1.1 за прокси-сервером Nginx v. 1.2.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

Но Nginx выдает ошибку 404, когда я пытаюсь получить доступ к таблице стилей Django ...

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 и проверил свои настройки STATIC_ROOT, STATIC_URL и STATICFILES_DIR.
  • Я запустил команду "collectstatic" на своем сервере и убедился, что она скопировала статические файлы административного сайта Django в мой STATIC_ROOT.
  • Я попытался добавить дополнительную директиву местоположения в свой файл конфигурации nginx, как описано здесь и перезапустил мою службу Nginx.
  • Я попытался создать каталог / www / example / static / admin, а затем создать в нем «статическую» символическую ссылку, указывающую на статический каталог ... / django / contrib / admin / static / в моем каталоге виртуальной среды.
  • Я загрузил главную страницу администратора в Chrome с видимой консолью разработчика, чтобы увидеть, не произошло ли что-то странное, но он сообщил только об ошибках 404.

Я собираюсь попробовать «патч обезьяны», скопировав статические файлы Django в каталог статических файлов моего сайта и изменив hrefs в моей версии base.html. Однако это не лучшее решение.

Извините за такой длинный пост. Кто-нибудь может сказать мне, что я делаю не так? Помимо этого, сайт администратора, похоже, работает. Просто таблицы стилей не загружаются. Спасибо!


person Jim    schedule 12.02.2015    source источник
comment
Может быть проблема с разрешениями на /www/example/static/? Изменить: похоже, что ваш STATIC_ROOT не соответствует псевдониму location /static/ nginx. Вы пропали /var/   -  person schillingt    schedule 12.02.2015
comment
Вот и все! Мне просто нужна была дополнительная пара глаз. Если вы хотите репостить свой комментарий в качестве ответа, я буду очень рад отдать вам должное. Надеюсь, другие люди хотя бы сочтут это полезным в качестве набора шагов, которые они могут предпринять для устранения такого рода проблем. Спасибо еще раз.   -  person Jim    schedule 12.02.2015


Ответы (1)


Похоже, ваш STATIC_ROOT не совпадает с псевдонимом location /static/ nginx. Вы пропали /var/

person schillingt    schedule 12.02.2015