Django-конвейер не обслуживает файлы в режиме разработки

Я пытаюсь скомпилировать статические с помощью django-pipe, но не могу обслуживать статические в режиме разработки. Так как я не разработчик Django, я могу ошибаться в том, как Django обслуживает статические файлы. Вот моя структура проекта:

  • проект (сам проект)
    • проект (настройки, глобальные настройки URL и т. д.)
    • приложение (основное и единственное приложение)
      • static (статические файлы на основе приложения, пространство имен которых находится в папке с именем приложения)
    • статический (общий статический, не связанный с конкретным приложением)
      • CSS
        • app.styl
    • общественности
      • средства массовой информации
      • статический (не используется в dev env; только для производства: должен подаваться с помощью nginx, автоматически генерируется с помощью collectstatic)

Поскольку я использую общую статическую, я указал STATICFILES_DIRS директива, чтобы разрешить Django Dev Server и collectstatic Команда для поиска общей статики:

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

Вот мой settings.py:

# for production, should be served via nginx
STATIC_ROOT= os.path.join(BASE_DIR, 'public/static/')
# prefix for static app
STATIC_URL = '/static/'

# also django-pipeline config
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'pipeline.finders.PipelineFinder',
)
STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'

PIPELINE = {
    'PIPELINE_ENABLED': True,
    'COMPILERS': (
        'pipeline.compilers.stylus.StylusCompiler',
    ),
    'STYLESHEETS': {
        'app': {
            'source_filenames': (
              'css/app.styl',
            ),
            'output_filename': 'css/app.css',
        },
    },
}

В моем шаблоне я указал CSS-группу:

  {% load pipeline %}
  {% stylesheet 'app' %}
</head>

В результате генерируется такой HTML:

  <link href="/static/css/app.css" rel="stylesheet" type="text/css" />
</head>

Но /static/css/app.css возвращает 404.

Если я бегу collectstatic, public/static/css/app.css построено. Но, как я понимаю, логика Django, она используется только для обслуживания производства на основе apache/nginx, а не в dev one. В режиме dev статический сервис подается через внутренний сервер Django с некоторыми промежуточными программными средствами django-pipe.

Что я делаю не так? Любая помощь приветствуется, спасибо.

UPD: я добавил + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) для глобальных urlpatterns, однако не могу понять, почему это рекомендуется - STATIC_ROOT используется только для производства с внешним прокси-сервером, а не с самим Django. Или нет?

2 ответа

Решение

Для всех, борющихся с той же проблемой. Просто удали 'PIPELINE_ENABLED': True, подальше от конфига джанго-конвейера. После этого, django-pipe будет перекомпилировать static для каждого запроса в режиме dev.

А перед развертыванием просто запустите collectstatic и установить DEBUG=False, как это упоминается в документах. После того, как этот конвейер прекратит повторную компиляцию файлов для каждого запроса, загрузите минимизированные ресурсы в шаблоны, и вы сможете обслуживать статические данные из STATIC_ROOT с любым сторонним прокси-сервером, таким как NGINX.

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

Другие вопросы по тегам