Django-pipeline 不在开发模式下提供文件
Django-pipeline not serving files in development mode
我正在尝试使用 django-pipeline 编译静态,但无法在 dev 模式下提供静态服务。由于我不是 Django 开发人员,所以我可能对 Django 本身提供静态文件的方式有误。这是我的项目结构:
- 项目(项目本身)
- 项目(设置、全局 url 配置等)
- app(主要且唯一的应用程序)
- static(基于应用程序的静态文件,命名空间通过 应用程序名称 文件夹)
- static(共享静态,未链接到特定应用程序)
- css
- app.styl
- public
- 媒体
- static(未在开发环境中使用;仅用于生产:应与 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-group:
{% load pipeline %}
{% stylesheet 'app' %}
</head>
因此,生成了这样的HTML:
<link href="/static/css/app.css" rel="stylesheet" type="text/css" />
</head>
但是/static/css/app.css
returns404.
如果我运行collectstatic
,public/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
条件控制来实现此开关。
我正在尝试使用 django-pipeline 编译静态,但无法在 dev 模式下提供静态服务。由于我不是 Django 开发人员,所以我可能对 Django 本身提供静态文件的方式有误。这是我的项目结构:
- 项目(项目本身)
- 项目(设置、全局 url 配置等)
- app(主要且唯一的应用程序)
- static(基于应用程序的静态文件,命名空间通过 应用程序名称 文件夹)
- static(共享静态,未链接到特定应用程序)
- css
- app.styl
- css
- public
- 媒体
- static(未在开发环境中使用;仅用于生产:应与 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-group:
{% load pipeline %}
{% stylesheet 'app' %}
</head>
因此,生成了这样的HTML:
<link href="/static/css/app.css" rel="stylesheet" type="text/css" />
</head>
但是/static/css/app.css
returns404.
如果我运行collectstatic
,public/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
条件控制来实现此开关。