Django-конвейер не обслуживает файлы в режиме разработки
Я пытаюсь скомпилировать статические с помощью django-pipe, но не могу обслуживать статические в режиме разработки. Так как я не разработчик Django, я могу ошибаться в том, как Django обслуживает статические файлы. Вот моя структура проекта:
- проект (сам проект)
- проект (настройки, глобальные настройки URL и т. д.)
- приложение (основное и единственное приложение)
- static (статические файлы на основе приложения, пространство имен которых находится в папке с именем приложения)
- статический (общий статический, не связанный с конкретным приложением)
- CSS
- app.styl
- CSS
- общественности
- средства массовой информации
- статический (не используется в 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.
Оригинальный ответ автора вопроса хорош, но мне кажется, что вам не нужно делать это вручную. Вы можете иметь этот переключатель с одним if
else
условный контроль.