如何修改 Procfile 在 Heroku 上的非标准文件夹中运行 Gunicorn 进程?

65

我是一个新手,对于Heroku和Gunicorn不太了解,所以不确定它们是如何工作的。但是我已经搜索了一些资料,我认为我已经接近部署我的Django应用程序(1.5.1版本)。因此,我知道我需要一个Procfile文件,其中包含以下内容:

web: gunicorn app.wsgi

因为我的目录有些不同,所以我不能在根目录下运行gunicorn。

app_project
    requirements/
    contributors/
    app/
        app/
            settings/
            wsgi.py
        # Normally Procfile goes here
    Procfile

通常情况下,app/是根目录,但我决定以这种方式组织我的文件夹,将Django应用程序从其他一些东西中分离出来。由于我必须将Procfile放在根目录中,以便Heroku识别它,那么我应该在Procfile中放什么,或者在gunicorn命令中应该放置哪些参数?

注意:

web: gunicorn app.wsgi # won't work because Procfile is in a directory above
                       # I also want to keep the directories as is
                       # I also don't want to create a secondary git inside the app folder just for heroku
web: gunicorn app.app.wsgi # won't work because I don't want to convert the folder into a python module

我很好奇...为什么你不想在顶层的app/文件夹中添加一个__init__.py文件呢? - eikonomega
我尝试将__init__.py添加到同一项目布局的顶层目录中,但它并不能解决所有错误。即使您通过了项目导入错误,然后出现设置导入错误,因为它们不在Python路径中。因此,Graham的解决方案可能是最好的选择。 - Serge Mosin
4个回答

79

尝试:

web: gunicorn --pythonpath app app.wsgi

我在部署过程中遇到了类似的问题,已经卡了好几天了。请问你能帮忙看一下吗?链接如下:https://stackoverflow.com/questions/63465541/django-vuejs-app-deployed-to-heroku-showing-application-error-on-page?noredirect=1#comment112420587_63465541 - banky

71

正如 @Graham Dumpleton 在他的回答中所说,OP的问题可以通过修改他的Procfile来解决:

web: gunicorn --pythonpath app app.wsgi

为什么这个方法有效:

  • 请记住,Procfile只是被Heroku用来启动进程的。在这种情况下,是gunicorn进程。
  • Gunicorn的--pythonpath参数允许您动态附加目录到Python运行时搜索模块查找时要搜索的目录列表中。
  • 通过将--pythonpath app添加到gunicorn命令中,解释器基本上被告知'在app目录中查找一个名为app的包(也称为app),其中包含一个名为wsgi的模块。`

OP问题中文件夹的通用名称可能会掩盖命令的语法,其语法如下: gunicorn --pythonpath <directory_containing_package> <package>.<module>

更多信息:
Gunicorn文档


1
每个不同参数的解释都非常出色。 - kas
1
感谢您详细说明为什么被接受的答案是有效的。非常感谢! - allardbrain
1
这个答案今天仍然很有用!谢谢! - Ezra_Bender
我已经卡了好几天,试图部署我的Django / Vuejs应用程序,但在成功部署后仍然遇到应用程序错误。问题似乎与wsgi和Procfile文件路径有关。你能帮忙看一下吗? https://stackoverflow.com/questions/63465541/django-vuejs-app-deployed-to-heroku-showing-application-error-on-page?noredirect=1#comment112420587_63465541 - banky

6
我为了让这个工作起来,做了一个丑陋的黑客。所以我将发布我的答案,但我希望你们能想出更好的解决方案。
Procfile
web: sh ./app/run.sh

app_project/app/run.sh

#!/bin/bash

cd app
gunicorn app.wsgi

5
如果您的文件被嵌套在文件夹中,下面的内容会更加易懂:
不要将路径添加到PYTHONPATH环境变量中,而是像引用包中的模块一样进行引用:
在我的情况下,app对象在folderA里的folderB里的scriptC.py中。
web: gunicorn folderA.folderB.scriptC:app

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接