【发布时间】:2016-09-27 10:31:02
【问题描述】:
我正在尝试使用 django-pipeline 编译静态,但无法在 dev 模式下提供静态服务。由于我不是 Django 开发人员,因此我可能会错了 Django 自己提供静态文件的方式。这是我的项目结构:
-
项目(项目本身)
- 项目(设置、全局 url 配置等)
-
app(主要且唯一的应用)
- 静态(基于应用的静态文件,通过应用名称文件夹命名)
-
静态(共享静态,未链接到特定应用)
- CSS
- app.styl
- CSS
-
公开
- 媒体
- 静态(不用于开发环境;仅用于生产:应与 nginx 一起提供,通过 collectstatic 自动生成)
当我使用共享静态时,我指定了 STATICFILES_DIRS 指令以允许 Django dev 服务器和 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 之一。在 dev 模式下,静态是通过带有一些中间件 django-pipeline 钩子的内部 Django 服务器提供的。
我做错了什么?任何帮助表示赞赏,谢谢。
UPD:我已将 + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 添加到全局 urlpatterns,但无法理解这是推荐的原因 - STATIC_ROOT 仅用于外部代理服务器的生产,而不用于 Django 本身。还是不行?
【问题讨论】:
-
如果我设置
'PIPELINE_ENABLED': False,每次我在开发模式下点击 HTTP 请求时,Django 都会自动收集静态数据。好吗?
标签: django django-staticfiles django-pipeline