Django с ./manager runserver работает хорошо, а Django + uwsgi возвращает 404

Это мой settings.py о static в settings.py:

STATIC_ROOT = '/home/coat/www/site/app/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
"/usr/lib/python2.6/site-packages/django/contrib/admin/static/",
# This is Django admin default static files
)

Я пользователь сервера django:

./manager runserver

Затем я открываю URL: http://localhost:8000/static/admin/css/base.css

Это работает очень хорошо.

Но открытый http://localhost/static/admin/css/base.css

Он печатает «404»

введите здесь описание изображения

Я много раз перезапускал Nginx и uwsgi, но это не сработало.


person thlgood    schedule 18.07.2012    source источник
comment
выложите пожалуйста конфиг nginx для этого сайта   -  person jpic    schedule 18.07.2012


Ответы (2)


Во-первых, это nononono:

STATIC_ROOT = '/home/coat/www/site/app/static/'

Никогда не указывайте абсолютные пути жестко, вы просто сделаете свой файл настроек менее переносимым и, возможно, убьете котят. Адаптируйте это к вашим потребностям:

import os.path
import posixpath

PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')

STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')

# fix STATICFILES_DIRS too

Теперь к вашему вопросу. django.contrib.staticfiles — это фантастика, но, вероятно, поначалу она немного сбивает с толку.

  1. #P4# <блочная цитата> #P5#
  2. С runserver статические файлы обслуживаются автоматически, но в рабочем режиме (DEBUG=False, реальный HTTP-сервер, такой как Nginx) вам следует запустить collectstatic для (пере)сборки STATIC_ROOT.

  3. STATIC_ROOT: это корневой путь, по которому HTTP-сервер должен обслуживать статические файлы из.

  4. STATIC_URL: это корневой URL-адрес, по которому HTTP-сервер должен обслуживать статические файлы на.

  5. STATICFILES_DIRS: другие статические каталоги в дополнение к «статическому» подкаталогу каждого приложения. Поскольку django.contrib.admin — это обычное приложение со «статической» папкой, указывать его в настройках не нужно.

Вывод: если STATIC_ROOT разрешается в /home/coat/www/site/app/static/, а STATIC_URL равен /static/, вам следует:

  1. Запустите команду управления collectstatic

  2. Настройте Nginx для обслуживания /home/coat/www/site/app/static/ на /static/, т.е.:

    location ^~ /static/ {
        alias /home/coat/www/site/app/static/;
    }
    
  3. Перезагрузить nginx

person jpic    schedule 18.07.2012

В процессе разработки команда runserver творит чудеса, чтобы обслуживать ваши статические файлы. В продакшене вам нужно настроить NGinx для этого. В документации Django есть две главы, которые я рекомендую вам прочитать:

  1. Обслуживание статических файлов в рабочей среде
  2. Обслуживание файлов (развертывание)

Особенно последняя ссылка объясняет, как вам нужно настроить NGinx для обслуживания ваших статических файлов.

person Jens    schedule 18.07.2012