部署到 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>/

&lt;git_repository_root&gt; 包含项目管理和部署相关的东西(requirements.txtProcfilefabfile.py 等)

&lt;django_project_root&gt; 包含我的 Django 应用程序和应用程序逻辑。

最后,&lt;configuration_root&gt; 包含我的settings.pywsgi.py

我尝试过的:

我的Procfile 应该是这样的(根据Heroku Docs):

web: gunicorn myapp.wsgi

使用此项目布局运行 foreman start 时,出现错误:

ImportError: Import by filename is not supported.

什么有效:

如果我将我的 Procfile 从 &lt;git_repository_root&gt; 移动到 &lt;git_repository_root&gt; 它可以在本地工作。推送到 Heroku(注意:Heroku 看到 &lt;git_repository_root&gt;)后,我无法扩展任何工作程序/添加进程。我得到以下信息:

Scaling web dynos... failed
 !    No such process type web defined in Procfile.

我相信我无论如何都希望在我的&lt;git_repository_root&gt; 中使用Procfile - 那么为什么它不起作用呢?我还尝试将Procfile 更改为: web: gunicorn myapp/myapp.wsgi

但没有运气。任何帮助将不胜感激!

【问题讨论】:

措辞/记录良好的问题,顺便说一句。 【参考方案1】:

将您的Procfile 移回&lt;git_repository_root&gt; 并使用:

web: gunicorn <django_project_root>.myapp:myapp

把最后的“myapp”换成你应用的类名,大概就是“myapp”吧。

... 并阅读错误消息:它告诉您不能通过文件名 (myapp.wsgi) 导入您的工作人员类 (app),所以当然说 dirname/myapp.wsgi 不会作为好吧。您需要 Python module:class 语法。

【讨论】:

【参考方案2】:

Procfile 中的条目视为 bash 命令。您可以将cd 转入您的&lt;django_project_root&gt;,然后运行服务器。

例如,您的Procfile(应该在您的&lt;git_repository_root&gt; 中)可能如下所示:

web: cd <django_project_root> && gunicorn 
     --env DJANGO_SETTINGS_MODULE=<configuration_root>.settings 
     <configuration_root>.wsgi

【讨论】:

您的问题完全正确,提供的解决方案也恰到好处。自 2013 年以来的一个问题,措辞和回答都很好

以上是关于部署到 Heroku 时指定项目根目录的主要内容,如果未能解决你的问题,请参考以下文章

如何用heroku和mLab部署项目(Nodejs项目)

部署到 Heroku 时 collectstatic 命令不运行,但设置非常好

我们可以在部署到 Elastic Beanstalk 时指定 Dockerfile 路径吗?

数据库更改时,Heroku 部署的 Django 网页不会更新

ImportError:在 Heroku 上部署时没有名为“解耦”的模块

如何将 django/react 应用程序部署到具有不同目录结构的 heroku