Django и css на gunicorn+nginx

Рейтинг: 0Ответов: 1Опубликовано: 05.01.2015

Сделал проект на django 1.6, пока работал на тестовом сервере, все было ок. Сейчас загрузил проект на рабочий сервер с помощью Digital Ocean. Использовал образ Ubuntu 14.04 + django и не могу понять, как подключить статику (css, images, etc.).

Ответы

▲ 3Принят

Разместите всю свою статику (css, js, картинки, шрифты) в папку staticfiles в корне проекта или в папке static какого-либо приложения.

Разместите всю медиа (загружаемые пользователем файлы) в папке media в корне проекта.

В settings.py укажите следующие настройки:

# добавим это чтоб не писать полные пути
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

# настроим статику
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'staticfiles'),
)

# И заодно еще медийку
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

В настройках nginx в секцию server добавьте следующие локейшены:

location /media {
    alias /full/path/to/you/project/media; # Это полный путь к папке media в корне вашего проекта
    expires max;
}
location /static {
    alias /full/path/to/you/project/static; # Это полный путь к папке static в корне вашего проекта
    expires max;
}

Перезапустите nginx.

Выполните команду

python manage.py collectstatic

Что будет происходить и для чего это нужно:

collectstatic пробежится по всем папкам, перечисленным в STATICFILES_DIRS, а также по всем папкам static внутри каждого приложения django, указанного в INSTALLED_APPS. Все найденные там файлы он сложит в одну папку, указанную в STATIC_ROOT, то есть в static. Nginx направлен на эту папку и будет раздавать из нее файлы.
Нужно это для хранения статики отдельно в каждом приложении, чтоб оно было независимым и при этом не приходилось на каждый запрос лазить по всем папкам и искать там файлы, как это делает dev-сервер.

С media (если она вам нужна) все немного проще. Django будет складывать туда файлы, а nginx их раздавать.