Python 3.x 我的Flask gunicorn应用程序如何记住其状态?

Python 3.x 我的Flask gunicorn应用程序如何记住其状态?,python-3.x,heroku,flask,gunicorn,Python 3.x,Heroku,Flask,Gunicorn,我正在heroku的gunicorn上运行python3/flask应用程序。此应用程序向用户提供从API调用中提取的项目列表,供用户接受或拒绝。根据用户是否点击与每个项目相关联的接受或拒绝链接,应用程序会将项目附加到内部接受项目列表或拒绝项目列表中 目前,我正在将每个列表(建议、接受和拒绝)存储为应用程序中的pandas dataframe对象 i、 e.我使用空数据框初始化我的应用程序: app = Flask(__name__) app.accepted = pd.DataFrame()

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

目前,我正在将每个列表(建议、接受和拒绝)存储为应用程序中的pandas dataframe对象

i、 e.我使用空数据框初始化我的应用程序:

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>
@app.route(“/get\u建议”)
def get_建议():
app.suggered=
点击“接受”链接后,将建议项附加到接受的数据帧:

@app.route("/accept/<suggest_id>")
def accept_item(suggest_id):
  app.accepted(len(app.accepted)) = app.suggested.loc[int(suggest_id)]
@app.route(“/accept/”)
def接受项目(建议id):
app.accepted(len(app.accepted))=app.sugged.loc[int(suggest_id)]
在本地miniconda虚拟环境(运行“heroku local web”)的gunicorn上运行时,这一切都很好,但在heroku上部署时,我会不断收到“内部服务器错误”。当我查看日志时,似乎应用程序的内部变量(例如app.suggered)未被保留,因此在运行accept_项时,app.suggered始终为空。为什么它们会保留在本地版本上,而不会保留在heroku部署上


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

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

  • 要么将此状态保存到cookies中(我不建议这样做),要么
  • 将这些数据存储到数据库中,如(例如),并使用SQLAlchemy或其他一些ORM来检索和存储这些数据
Heroku dynos(运行web应用程序)是无状态的。它们可以随意重新启动,不保存磁盘等

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

您可以使用存储此状态,但由于您在Heroku上运行,这会带来麻烦,因为dynos将随机重新启动