我尝试使用django-pipeline编译静态,但无法在 dev 模式下设置静态服务。由于我不是Django开发人员,我可能错误的是Django本身如何提供静态文件。这是我的项目结构:
当我使用共享静态时,我已指定Variable description: Value1
Longer variable description: Value2
指令允许Django dev 服务器和STATICFILES_DIRS
命令查找共享静态:< / p>
collectstatic
这是我的STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
:
settings.py
在我的模板中,我已经指定了CSS-group:
# 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',
},
},
}
结果,生成了这样的HTML:
{% load pipeline %}
{% stylesheet 'app' %}
</head>
但 <link href="/static/css/app.css" rel="stylesheet" type="text/css" />
</head>
会返回404。
如果我运行/static/css/app.css
,则构建collectstatic
。但正如我理解Django逻辑,它仅用于基于apache / nginx的生产服务,而不是用于 dev 之一。在 dev 模式下,静态通过内部Django服务器与一些中间件django-pipeline挂钩提供。
我做错了什么?感谢任何帮助。谢谢。
UPD:我已将public/static/css/app.css
添加到全局网址,但无法理解其推荐原因 - 使用了STATIC_ROOT仅适用于使用外部代理服务器进行生产而不适用于Django本身。或者不是?
答案 0 :(得分:6)
对于每个人来说,与同样的问题作斗争。只需从django-pipeline config中删除'PIPELINE_ENABLED': True,
即可。在此之后,django-pipeline将在开发模式下为每个请求重新编译静态。
在部署之前,只需运行collectstatic
并设置DEBUG=False
,就像在文档中提到的那样。此管道将停止为每个请求重新编译文件,在模板中加载缩小的资产,您就可以使用任何第三方代理服务器(如NGINX)从STATIC_ROOT
提供静态。
答案 1 :(得分:0)
问题的作者的原始答案很棒,但在我看来,您不需要手动执行此操作。您可以使用单个if
else
条件控件来启用此开关。