我在Heroku上有一个Django应用程序,具有登台和生产环境。静态文件托管在S3上。我正在简化我的部署过程,并计划在手动工作后设置fabfiles。
如何配置collectstatic以推送到多个地方?如果我在本地运行它,它使用我的开发设置(使用本地STATIC_ROOT)。如果我在我的一个Heroku应用程序上运行它(heroku运行./manage.py collectstatic),那么它就无法获取文件(因为.slugignore确保它们永远不会被推送到Heroku)。如果我在Procfile中包含collectstatic,则同样适用。
我也在使用django-pipeline,虽然因为我被困在了collectstatic位上,所以还没有做太多。
更新
在回答Marat的问题时,我尝试将一个设置文件作为选项传递给collectstatic:./manage.py collectstatic --settings=project.settings.prod
,但收到错误:Unknown command: 'collectstatic'
我在服务器上检查过,而Installed Apps确实包含了django.contrib.staticfiles我也可以远程运行collectstatic,所以我不确定是什么原因造成的。
答案 0 :(得分:2)
您可以设置环境变量DJANGO_SETTINGS_MODULE,这样您就不需要在任何地方指定设置:
heroku config:set DJANGO_SETTINGS_MODULE=project.settings.prod
答案 1 :(得分:0)
首先,如果您要通过CloudFront提供静态服务,则可以使用自定义源并始终使用本地STATIC_ROOT。实际上它比S3源有一些优势,例如gzip支持。
您可以做的另一件好事是将环境相关设置放在单独的文件中,然后将其导入settings.py,例如:
local_settings.py(不在项目存储库中,但您可以使用local_settings.py.example):
#environment dependent settings
DATABASES = { .. }
CACHES = { .. }
STATIC_ROOT = 'your_path/static'
settings.py:
import local_settings
答案 2 :(得分:0)
我刚刚在Upload Media from Heroku to Amazon S3回复了类似的问题。如果您自定义设置以考虑环境变量,则可以在推送到Heroku时在本地使用文件系统存储后端和S3存储后端。这将在你的slug编译时收集和上传你的静态文件。