См.также
Что такое django.contrib.staticfiles можно прочитать в разделе Работа со статическими файлами (например изображения, JavaScript, CSS).
Процесс работы со статикой на боевом сервер очень простой: выполните collectstatic при изменении статических файлов, затем организуйте отправку каталога со статикой (STATIC_ROOT) на ваш сервер статических файлов. В зависимости от STATICFILES_STORAGE файлы может быть необходимо перенести в другой каталог самостоятельно, или же метод post_process класса Storage может сделать это самостоятельно.
Конечно же, как и в каждой процедуре развертывания, дьявол кроется в мелочах. Настройки сервера могут немного отличаться и вам придется затачивать все это под себя. Ниже мы описали несколько стандартных шаблонов, которые могут помочь вам.
Если вы используете один сервер для приложения и для статики, тогда процесс обновления следующий:
Обновите код на сервере.
На сервере выполните команду collectstatic, чтобы скопировать файлы в STATIC_ROOT.
Настройте веб-сервер для раздачи файлов из STATIC_ROOT по URL-у из STATIC_URL. Например, как это сделать для Apache и mod_wsgi.
Возможно, вы захотите автоматизировать этот процесс, особенно если у вас несколько веб-серверов. Есть много способов сделать это, обычно разработчики на 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
)
Еще один вариант раздачи статических файлов, это через облачные сервисы, такие как 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, смотрите раздел о статических файлах.
Mar 31, 2016