将 Flask 应用部署到 Heroku

23
我试图在Heroku上使用Flask开发我的第一个“大型”应用程序,并尝试将这里的基本教程:https://devcenter.heroku.com/articles/python与此处的说明结合起来:http://flask.pocoo.org/docs/patterns/packages/#larger-applications。通过 "foreman start" 在本地工作,但是当我推送到 Heroku 时,出现了错误,提示使用了错误的端口号:

  

使用命令 python run.py 启动进程   2012-12-04T23:45:18 +00:00 app [web.1]: * 运行在   http: //127.0.0.1:5000/ 2012-12-04T23:45:18 +00:00 app [web.1]:*   重新启动重载器2012-12-04T23:45:23 +00:00 heroku [web.1]:   错误R11(Bad bind) - > 进程绑定到端口5000,应该是33507   (参见环境变量PORT)

我对所有这些都是新手,但看起来它正在尝试在Heroku上“本地”运行。 我已经尝试了各种组合,但无法使其正常工作。 目前我的代码非常简单(应用程序名称为“pml”):

目录:/pml

Procfile:

web: python run.py

运行.py:

from pml import app
app.run(debug=True)

目录: /pml/pml/

__init__.py

from flask import Flask
app = Flask(__name__)

import pml.views

视图.py

from pml import app

@app.route('/')
def index():
    return 'Hello World!'
1个回答

36
我没有使用过Heroku,但在我看来,它似乎为Flask保留了一个端口,具体是33507。它似乎会尝试使用一个环境变量,在Heroku中我不确定如何设置它。好消息是你可以告诉Flask使用哪个端口。
尝试这样做:
app.run(debug=True, port=33507)

看起来在heroku中将端口添加到环境变量的方法是这样的:

heroku config:add PORT=33507

你只需要执行其中一个操作。我建议尝试第一种方式,因为在我看来,这是解决问题的直接方法。

编辑
阅读了您发布的文章后,我看出了问题所在。

port = int(os.environ.get('PORT', 5000))

这行代码的意思是,如果环境变量中设置了PORT的值,则获取该值,否则使用5000。虽然我不确定为什么他们不允许从5000端口运行,如果文档中指定了端口号,但我建议尝试进行此更改:

port = int(os.environ.get('PORT', 33507))

10
感谢您指引我正确的方向。最终我通过将run.py更改为以下内容,使它能够工作:import os from pml import app port = int(os.environ.get('PORT', 5000)) app.run(host='0.0.0.0', port=port) - crix
1
Heroku为每个dyno分配PORT变量。这不是你可以选择的。
  1. 不要在缺少PORT时提供回退值,它将被设置。
  2. 不要尝试手动设置PORT变量。
- Peter Lada
@PeterLada 那这个解决方案就不再可行了吗? - Smart Manoj
1
从未工作过。只需使用port = int(os.getenv('PORT')),该值将始终由Heroku设置。 - Peter Lada

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