64

我是 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
4

4 回答 4

76

尝试:

web: gunicorn --pythonpath app app.wsgi
于 2013-05-08T00:05:09.303 回答
66

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

web: gunicorn --pythonpath app app.wsgi

为什么这样有效:

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

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

更多信息:
Gunicorn 文档

于 2013-10-30T00:44:42.053 回答
6

我做了一个丑陋的黑客让这个工作。所以我要发布我的答案,但我希望你们能想出一个更好的解决方案

档案

web: sh ./app/run.sh

app_project/app/run.sh

#!/bin/bash

cd app
gunicorn app.wsgi
于 2013-05-07T10:20:55.037 回答
5

如果您的文件嵌套在文件夹中,则以下内容会更有意义。

我没有将路径添加到 PYTHONPATH 环境变量,而是像引用包中的模块一样引用它:

在我的例子中,应用程序对象位于文件夹 B 内的 scriptC.py 中,该文件夹位于文件夹 A 内。

web: gunicorn folderA.folderB.scriptC:app
于 2018-10-14T14:34:04.240 回答