部署到 Heroku 时指定项目根目录
Posted
技术标签:
【中文标题】部署到 Heroku 时指定项目根目录【英文标题】:Specifying project root when deploying to Heroku 【发布时间】:2013-08-07 05:44:32 【问题描述】:我的问题:
当使用 gunicorn 作为我的 WSGI HTTP 服务器时,foreman 无法找到 Django (wsgi?) 应用程序。
应用结构:
在我的 Django 应用程序中,我的结构如下:
<git_repository_root>/
<django_project_root>/
<configuration_root>/
<git_repository_root>
包含项目管理和部署相关的东西(requirements.txt
、Procfile
、fabfile.py
等)
<django_project_root>
包含我的 Django 应用程序和应用程序逻辑。
最后,<configuration_root>
包含我的settings.py
和wsgi.py
。
我尝试过的:
我的Procfile
应该是这样的(根据Heroku Docs):
web: gunicorn myapp.wsgi
使用此项目布局运行 foreman start
时,出现错误:
ImportError: Import by filename is not supported.
什么有效:
如果我将我的 Procfile 从 <git_repository_root>
移动到 <git_repository_root>
它可以在本地工作。推送到 Heroku(注意:Heroku 看到 <git_repository_root>
)后,我无法扩展任何工作程序/添加进程。我得到以下信息:
Scaling web dynos... failed
! No such process type web defined in Procfile.
我相信我无论如何都希望在我的<git_repository_root>
中使用Procfile
- 那么为什么它不起作用呢?我还尝试将Procfile
更改为:
web: gunicorn myapp/myapp.wsgi
但没有运气。任何帮助将不胜感激!
【问题讨论】:
措辞/记录良好的问题,顺便说一句。 【参考方案1】:将您的Procfile
移回<git_repository_root>
并使用:
web: gunicorn <django_project_root>.myapp:myapp
把最后的“myapp”换成你应用的类名,大概就是“myapp”吧。
... 并阅读错误消息:它告诉您不能通过文件名 (myapp.wsgi) 导入您的工作人员类 (app
),所以当然说 dirname/myapp.wsgi
不会作为好吧。您需要 Python module:class
语法。
【讨论】:
【参考方案2】:将Procfile
中的条目视为 bash 命令。您可以将cd
转入您的<django_project_root>
,然后运行服务器。
例如,您的Procfile
(应该在您的<git_repository_root>
中)可能如下所示:
web: cd <django_project_root> && gunicorn
--env DJANGO_SETTINGS_MODULE=<configuration_root>.settings
<configuration_root>.wsgi
【讨论】:
您的问题完全正确,提供的解决方案也恰到好处。自 2013 年以来的一个问题,措辞和回答都很好以上是关于部署到 Heroku 时指定项目根目录的主要内容,如果未能解决你的问题,请参考以下文章
部署到 Heroku 时 collectstatic 命令不运行,但设置非常好
我们可以在部署到 Elastic Beanstalk 时指定 Dockerfile 路径吗?
数据库更改时,Heroku 部署的 Django 网页不会更新