Справка приложения Django staticfiles - PullRequest
41 голосов
/ 30 декабря 2010

У меня небольшая проблема с приложением Django staticfiles .

Я добавил

'django.contrib.staticfiles',

к моему INSTALLED_APPS и добавили

STATIC_URL = '/static/'
STATIC_ROOT = '/Users/kevdotbadger/django/mylook/static/'

в мой settings.py файл.

Все мои статические файлы находятся в папке STATIC_ROOT на моем Mac.

Теперь в моем шаблоне я использую

{{ STATIC_URL }}

, который правильно отображает /static/.

Тем не менее

{{ STATIC_URL }}css/style.css

приводит к ошибке 404. Я использую команду 'runserver' в качестве сервера.

Я что-то упускаю?

Ответы [ 5 ]

118 голосов
/ 31 декабря 2010

Я умоляю вас прочитать документацию с инструкциями здесь: http://docs.djangoproject.com/en/dev/howto/static-files/

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

Во время разработки (при использовании представления с автоматическим обслуживанием) статические файлы будут автоматически искать статические файлы в различных местах (потому что вы вызываете их "служить "представление с путем к статическому файлу).Для этого поиска будут использоваться так называемые «искатели» (как определено в настройке STATICFILES_FINDERS).

  1. Одним из искателей по умолчанию является AppDirectoriesFinder, который будет выглядеть в «/static / "каталог каждого из приложений вашей установки INSTALLED_APPS.

  2. Другим поиском по умолчанию является FileSystemFinder, который будет искать каталоги, которые вы указали в настройке STATICFILES_DIRS.

Кстати, оба этих шаблона поиска похожи на то, как работает загрузка шаблона.

Тот же метод будет использоваться при запуске команды collectstatic, за исключением того, что теперь он будет собирать файлы из различныхместоположения (используя те же средства поиска, что и выше), помещая найденные файлы в STATIC_ROOT, готовые к развертыванию.

3 голосов
/ 25 октября 2012

Я нашел быстрый и простой способ обойти глобальные статические файлы проекта во время разработки:

  • Запустите новое приложение, содержащее статические файлы ваших проектов (например, "manage.py startapp static_content")
  • Создайте папку с именем «static» в этом приложении и поместите туда свои статические файлы.
  • Добавьте ваше новое приложение в список установленных приложений
3 голосов
/ 11 мая 2011

Если вам нужно только решение - прокрутите вниз до «Решение».

Обзор

Я обнаружил ту же проблему вчера. Вот что я нашел:

Все, что вам нужно, это соответствующий статический искатель, который найдет ваш STATIC_ROOT и все его содержимое, но такого искателя нет. Вот искатели по умолчанию:

  • django.contrib.staticfiles.finders.AppDirectoriesFinder - поиск в каталогах установленных приложений django для «статической» папки, но большинство из них пока используют устаревшие папки «media».

  • django.contrib.staticfiles.finders.FileSystemFinder - использовать все каталоги, упомянутые в STATICFILES_DIRS, но вы не можете добавить в него STATIC_ROOT.

  • django.contrib.staticfiles.finders.DefaultStorageFinder - поиск статического в вашем DEFAULT_FILE_STORAGE, который по умолчанию равен django.core.files.storage.FileSystemStorage и указывает на ваш MEDIA_ROOT

Решение

Вот и все, никаких дополнительных выборов. На данный момент нет выбора использовать STATIC_ROOT (в Django 1.3).
Поэтому я только что написал свой собственный искатель для этих нужд:

  • Файл пользовательского статического поиска: finders.py :

    from django.core.files.storage import FileSystemStorage
    from django.contrib.staticfiles.finders import BaseStorageFinder
    from django.conf import settings
    
    class StaticFinder(BaseStorageFinder):
        storage = FileSystemStorage(settings.STATIC_ROOT, settings.STATIC_URL)
    
  • settings.py

    STATICFILES_FINDERS = (
        'finders.StaticFinder',
    )
    
  • Если вы хотите использовать его с другими искателями - я предлагаю поместить их после него в STATICFILES_FINDERS

И помните : это решение следует использовать только в целях разработки, а не на производстве!

1 голос
/ 18 июня 2011
STATIC_ROOT = '/home/ws/be/bla/'
STATICFILES_DIRS = ('/home/ws/be/static/',)
STATIC_URL = '/static/'

Это работает для меня. STATIC_ROOT должен отличаться от STATICFILES_DIRS (предварительная альфа-версия Django 1.4 SVN-16436)

1 голос
/ 30 декабря 2010

Прежде всего, убедитесь, что у вас статическая подача включена в вашем urls.py ТОЛЬКО ДЛЯ РАЗРАБОТКИ.

Кроме того, там может быть дополнительная косая черта. Если ваш STATIC_URL == '/ static /', то

{{STATIC_URL}} / css / style.css должно быть {{STATIC_URL}} css / style.css.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...