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

How can my Flask gunicorn app remember its state?

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

目前,我将每个列表(建议、接受和拒绝)存储为应用程序中的 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>

然后在 'accept' link 被命中后将建议的项目附加到接受的数据框中:

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

在我的本地 miniconda 虚拟环境 (运行ning "heroku local web") 上,在 gunicorn 上 运行 一切正常,但是当部署在 heroku 上时,我一直得到 "Internal Server Error"。当我查看日志时,应用程序的内部变量(例如 app.suggested)似乎没有被保留,因此当 accept_item 为 运行 时,app.suggested 始终为空.为什么它们会保留在本地版本而不是 heroku 部署中?

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

您可以执行以下两项操作之一:

  • 要么将此状态保存到 cookie 中(我不推荐这样做),要么
  • 将此数据存储到像 Heroku Postgres 这样的数据库中(例如),并使用 SQLAlchemy 或其他一些 ORM 来检索和存储该数据。

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

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

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