我的Flask gunicorn应用程序如何记住它的状态?

时间:2016-08-07 17:36:26

标签: python-3.x heroku flask gunicorn

我在heroku的gunicorn上运行python3 / flask应用程序。此应用程序向用户显示从API调用中提取的项目列表,供用户接受或拒绝。根据用户是否点击与每个项目关联的接受或拒绝链接,应用程序会将该项目附加到已接受项目的内部列表中,这是被拒绝的项目之一。

目前,我将每个列表(建议,接受和拒绝)存储为应用程序中的pandas数据框对象。

即。我使用空数据框初始化我的应用程序:

app = Flask(__name__)
app.accepted = pd.DataFrame()
app.suggested = pd.DataFrame()

使用API​​调用填充建议数据框:

@app.route("/get_suggestions")
def get_suggestions():
  app.suggested = <some data returned from an API>

然后在接受&#39;接受后,将建议的项目附加到接受的数据框中。链接被点击:

@app.route("/accept/<suggest_id>")
def accept_item(suggest_id):
  app.accepted(len(app.accepted)) = app.suggested.loc[int(suggest_id)]

这一切在我当地的miniconda虚拟环境(运行&#34; heroku本地网络&#34;)上的gunicorn上运行良好,但是当部署在heroku时,我不断得到&#34;内部服务器错误&#34;。当我查看日志时,看起来应用程序的内部变量(例如app.suggested)未被保留,因此当运行accept_item时,app.suggested始终为空。为什么它们会在本地版本上保留,而不是在heroku部署中保留?

保存此状态的最简单方法是什么?我希望少数多个用户能够使用该应用程序,并且每个用户都可以构建自己的临时列表。我需要使用SQLite来保存状态吗?我是否需要将cookie放入用户的浏览器中,这样我就能分辨出不同的用户?我不想要求用户在我的网站上创建帐户。

1 个答案:

答案 0 :(得分:1)

你可以做以下两件事之一:

  • 将此状态保存为Cookie(我不建议使用)或
  • 将此数据存储到Heroku Postgres等数据库中(例如),并使用SQLAlchemy或其他一些ORM来检索和存储该数据。

Heroku dynos(运行您的Web应用程序)是无状态的。他们随意重启,不要坚持使用磁盘等等。

存储全局状态不会起作用,因为您定义的变量在每个传入请求中都会发生变化。

您可以使用app context来存储此状态,但由于您在Heroku上运行,因为dynos会随机重启,因此会遇到麻烦。