【问题标题】:Django-pipeline not serving files in development modeDjango-pipeline 在开发模式下不提供文件
【发布时间】:2016-09-27 10:31:02
【问题描述】:

我正在尝试使用 django-pipeline 编译静态,但无法在 dev 模式下提供静态服务。由于我不是 Django 开发人员,因此我可能会错了 Django 自己提供静态文件的方式。这是我的项目结构:

  • 项目(项目本身)
    • 项目(设置、全局 url 配置等)
    • app(主要且唯一的应用)
      • 静态(基于应用的静态文件,通过应用名称文件夹命名)
    • 静态(共享静态,未链接到特定应用)
      • CSS
        • app.styl
    • 公开
      • 媒体
      • 静态(不用于开发环境;仅用于生产:应与 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


【解决方案1】:

对于每个人来说,都在为同样的问题而战。只需从 django-pipeline 配置中删除 'PIPELINE_ENABLED': True, 即可。之后,django-pipeline 会在 dev 模式下为每个请求重新编译静态。

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

【讨论】:

  • 仅供参考,django-pipeline 文档声明 PIPELINE_ENABLED 默认为“not settings.DEBUG”,因此只要您切换 DEBUG,就没有必要设置它。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2014-03-13
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多