Развертывание статических файлов

См.также

Что такое django.contrib.staticfiles можно прочитать в разделе Работа со статическими файлами (CSS, изображения).

Раздача статических файлов на боевом сервере

Процесс работы со статикой на боевом сервер очень простой: выполните collectstatic при изменении статических файлов, затем организуйте отправку каталога со статикой (STATIC_ROOT) на ваш сервер статических файлов. В зависимости от STATICFILES_STORAGE файлы может быть необходимо перенести в другой каталог самостоятельно, или же метод post_process класса Storage может сделать это самостоятельно.

Конечно же, как и в каждой процедуре развертывания, дьявол кроется в мелочах. Настройки сервера могут немного отличаться и вам придется затачивать все это под себя. Ниже мы описали несколько стандартных шаблонов, которые могут помочь вам.

Один сервер для приложения и для статики

Если вы используете один сервер для приложения и для статики, тогда процесс обновления следующий:

Возможно, вы захотите автоматизировать этот процесс, особенно если у вас несколько веб-серверов. Есть много способов сделать это, обычно разработчики на Django предпочитают Fabric.

Ниже вы найдете примеры скриптов для Fabric, которые собирают статику на сервере. Синтаксис скрипта очень простой, но мы не будем его описывать, читайте документацию Fabric.

Скрипт для Fabric может выглядеть следующим образом:

from fabric.api import *

# Hosts to deploy onto
env.hosts = ['www1.example.com', 'www2.example.com']

# Where your project code lives on the server
env.project_root = '/home/www/myproject'

def deploy_static():
    with cd(env.project_root):
        run('./manage.py collectstatic -v0 --noinput')

Раздача статических файлов с отдельного сервера

Большие проекты на Django используют отдельный сервер для раздачи статических файлов. Обычно он отличается от сервера для проекта – более быстрый, но с меньшими возможностями. Вот несколько вариантов:

Настройка этих серверов не является темой этой статьи, читайте соответсвующую документацию.

Т.к. статический сервер не запускает ваше приложение, необходимо поменять процесс обновления:

  • Когда статические файлы изменяются, выполните локально collectstatic.

  • Отправьте локальную версию STATIC_ROOT на статический сервер в каталог, который раздается сервером. rsync хороший инструмент для этого т.к. отправит на сервер только файлы, которые изменились.

Вот как может выглядеть ваш скрипт для Fabric:

from fabric.api import *
from fabric.contrib import project

# Where the static files get collected locally. Your STATIC_ROOT setting.
env.local_static_root = '/tmp/static'

# Where the static files should go remotely
env.remote_static_root = '/home/www/static.example.com'

@roles('static')
def deploy_static():
    local('./manage.py collectstatic')
    project.rsync_project(
        remote_dir = env.remote_static_root,
        local_dir = env.local_static_root,
        delete = True
    )

Раздача статических файлов через облачный сервис или CDN

Еще один вариант раздачи статических файлов, это через облачные сервисы, такие как Amazon’s S3 и/или CDN (content delivery network). Это избавляет вас от проблем с раздачей статических файлов и часто уменьшает время загрузки страниц (особенно при использовании CDN).

При использовании сервисов, процесс обновления аналогичен описанному выше, но вместо отправки файлов на сервер статики через rsync мы отправляем их в хранилище сервиса или CDN.

Есть разные способа сделать это, но если сервис предоставляет API, собственный беккенд для хранения файлов может сильно упростить процесс. Если вы используете сторонний бекенд, можете указать collectstatic использовать его, прописав в STATICFILES_STORAGE.

Например, вы создали бекенд для работы с S3 myproject.storage.S3Storage, можете использовать следующий код:

STATICFILES_STORAGE = 'myproject.storage.S3Storage'

Теперь можно просто запустить collectstatic и ваши файлы будут отправлены на S3. Если будет необходимо сменить сервис , просто укажите нужный бекенд в STATICFILES_STORAGE.

Как создать свой бекенд для работы с файлами, смотрите в Writing a custom storage system. Есть много сторонних бекендов для работы с API различных сервисов для хранения файлов. Начать поиск можно с djangopackages.com.

Узнайте больше

Подробности о настройках, командах, шаблонных тегах и других деталях, включая :mod:`django.contrib.staticfiles, смотрите раздел о статических файлах.