Работа со статическими файлами (CSS, изображения)

Веб-приложения обычно требуют различные дополнительные файлы для своей работы (изображения, CSS, Javascript и др.). В Django их принято называть “статическими файлами”(прим.пер. - или “статика”). Django предоставляет приложение django.contrib.staticfiles для работы с ними.

Этот раздел описывает как работать с ними.

Настройка статики

  1. Убедитесь что django.contrib.staticfiles добавлено INSTALLED_APPS.

  2. В настройках укажите STATIC_URL, например:

    STATIC_URL = '/static/'
    
  3. В шаблоне или “захардкодьте” URL /static/my_app/myexample.jpg, или лучше использовать тег static для генерация URL-а по указанному относительному пути с использованием бекенда, указанного в STATICFILES_STORAGE (это позволяет легко перенести статические файлы на CDN).

    {% load staticfiles %}
    <img src="{% static "my_app/myexample.jpg" %}" alt="My image"/>
    
  4. Сохраните статические файлы в каталоге static вашего приложения. Например my_app/static/my_app/myimage.jpg.

Serving the files

Кроме конфигурации, необходимо настроить раздачу статических файлов.

При разработке, если вы используете django.contrib.staticfiles, это все происходит автоматически через runserver, при DEBUG равной True (смотрите django.contrib.staticfiles.views.serve()).

Потому что это представление очень неэффективно и, возможно, небезопасно. Оно предназначено только для разработки, и не должно использоваться на боевом сервере.

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

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

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
    '/var/www/static/',
)

Смотрите описание настройки STATICFILES_FINDERS чтобы узнать, как staticfiles находит файлы.

Static file namespacing

Вы можете добавлять статические файлы непосредственно в каталог my_app/static/ (не создавая подкаталог my_app), но это плохая идея. Django использует первый найденный по имени файл и, если у вас есть файлы с одинаковым названием в разных приложениях, Django не сможет использовать оба. Необходимо как-то указать, какой файл использовать, и самый простой способ – это пространство имен. Просто положите их в каталог с названием приложения(my_app/static/my_app).

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

Если вы используете django.contrib.staticfiles как описано ваше, runserver все сделает автоматически, если DEBUG равна True. Если django.contrib.staticfiles не добавлено в INSTALLED_APPS, вы можете раздавать статические файлы используя представление django.contrib.staticfiles.views.serve().

Не используйте его на боевом сервере! Способы раздачи статических файлов описаны в разделе Развертывание статических файлов.

Например, если STATIC_URL равна /static/, вы можете добавить следующий код в urls.py:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Примечание

Это представление работает только при включенной отладке и для локальных префиксов (например /static/), а не полных URL-ов (e.g. http://static.example.com/).

Также эта функция раздает файлы из каталога STATIC_ROOT не выполняя поиск всех статических файлов, как это делает django.contrib.staticfiles.

Раздача файлов, загруженных пользователем, при разработке

При разработке медиа файлы из MEDIA_ROOT можно раздавать используя представление django.contrib.staticfiles.views.serve().

Не используйте его на боевом сервере! Способы раздачи статических файлов описаны в разделе Развертывание статических файлов.

Например, если MEDIA_URL равна /media/, вы можете добавить следующий код в urls.py:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Примечание

Это представление работает только при включенной отладке и для локальных префиксов (например /media/), а не полных URL-ов (e.g. http://media.example.com/).

Развертывание

django.contrib.staticfiles предоставляет команду, чтобы собрать все статические файлы в одном каталоге.

  1. Укажите в STATIC_ROOT каталог, из которого будут раздаваться статические файлы, например:

    STATIC_ROOT = "/var/www/example.com/static/"
    
  2. Выполните команду collectstatic:

    $ python manage.py collectstatic
    

    Она скопирует все статические файлы в каталоге STATIC_ROOT.

  3. Используйте любой веб-сервер для раздачи этих файлов. Способы раздачи статических файлов описаны в разделе Развертывание статических файлов.

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

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