Django-pipeline 不在开发模式下提供文件

Django-pipeline not serving files in development mode

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

因为我正在使用共享静态,所以我指定了 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-group:

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

因此,生成了这样的HTML:

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

但是/static/css/app.cssreturns404.

如果我运行collectstaticpublic/static/css/app.css就建好了。但据我了解 Django 逻辑,它仅用于 apache/nginx-based 生产服务,而不用于 dev 之一。在 dev 模式下,静态通过带有一些中间件 django-pipeline 挂钩的内部 Django 服务器提供服务。

我做错了什么?感谢任何帮助,谢谢。

UPD: 我已经将 + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 添加到全局 urlpatterns,但是无法理解为什么推荐它 - STATIC_ROOT 仅用于生产使用外部代理服务器而不是 Django 本身。还是不行?

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

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

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