Spec-Zone.ru › Django 1.8

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

Веб-сайты обычно нуждаются в обслуживании дополнительных файлов, таких как изображения, JavaScript или CSS. В 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.

Обслуживание файлов

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

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

Этот метод чрезвычайно неэффективен и, вероятно, несанктционирован, поэтому он не подходит для производства.

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

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

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

См. документацию для настройки STATICFILES_FINDERS для получения подробностей о том, как staticfiles находит ваши файлы.

Имена пространств имён статических файлов

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

Обслуживание статических файлов во время разработки.

Если вы используете 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 = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Примечание

Эта вспомогательная функция работает только в режиме отладки и только если заданный префикс является локальным (например, /static/) и не является URL-адресом (например, 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 = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Примечание

Эта вспомогательная функция работает только в режиме отладки и только если заданный префикс является локальным (например, /media/) и не является URL-адресом (например, http://media.example.com/).

Тестирование

При запуске тестов, использующих реальные HTTP-запросы вместо встроенного клиента тестирования (т.е. при использовании встроенного LiveServerTestCase) статические ресурсы должны обслуживаться вместе с остальным контентом, чтобы тестовая среда как можно точнее воспроизводила реальную, но LiveServerTestCase имеет только очень базовую функциональность обслуживания статических файлов: Она не знает о функции поиска в приложении staticfiles и предполагает, что статический контент уже собран в STATIC_ROOT.

Из-за этого staticfiles поставляется со своим собственным django.contrib.staticfiles.testing.StaticLiveServerTestCase, подклассом встроенного, который имеет возможность прозрачно обслуживать все ресурсы во время выполнения этих тестов, очень похожим на то, что мы получаем во время разработки с DEBUG = True, т.е. без предварительной необходимости собирать их с помощью collectstatic.

django.contrib.staticfiles.testing.StaticLiveServerTestCase — нововведение в Django 1.7. Ранее его функциональность предоставлялась django.test.LiveServerTestCase.

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

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, см. справочник по staticfiles.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.8/howto/static-files/index/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API