Работа со статическими файлами (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

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

При разработке это все происходит автоматически, если вы используете 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).

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

При разработке медиа файлы из 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)

Примечание

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

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

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

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

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

    ./manage.py collectstatic
    

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

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

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

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