Django管道不在开发模式下提供文件

时间:2016-05-29 14:53:54

标签: django django-staticfiles django-pipeline

我尝试使用django-pipeline编译静态,但无法在 dev 模式下设置静态服务。由于我不是Django开发人员,我可能错误的是Django本身如何提供静态文件。这是我的项目结构:

  • 项目(项目本身)
    • 项目(设置,全局网址配置等)
    • app (主要和唯一的应用)
      • 静态(基于应用的静态文件,通过应用名称文件夹命名空间)
    • 静态(共享静态,未与特定应用相关联)
      • CSS
        • app.styl
    • 公开
      • 媒体
      • 静态(不在dev env中使用;仅用于生产:应该使用nginx,通过collectstatic自动生成)

当我使用共享静态时,我已指定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本身。或者不是?

2 个答案:

答案 0 :(得分:6)

对于每个人来说,与同样的问题作斗争。只需从django-pipeline config中删除'PIPELINE_ENABLED': True,即可。在此之后,django-pipeline将在开发模式下为每个请求重新编译静态。

在部署之前,只需运行collectstatic并设置DEBUG=False,就像在文档中提到的那样。此管道将停止为每个请求重新编译文件,在模板中加载缩小的资产,您就可以使用任何第三方代理服务器(如NGINX)从STATIC_ROOT提供静态。

答案 1 :(得分:0)

问题的作者的原始答案很棒,但在我看来,您不需要手动执行此操作。您可以使用单个if else条件控件来启用此开关。