【问题标题】:How can my Flask gunicorn app remember its state?我的 Flask gunicorn 应用程序如何记住它的状态?
【发布时间】:2016-12-13 11:54:43
【问题描述】:

我在 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>

然后在点击“接受”链接后将建议的项目附加到接受的数据框中:

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

这一切都可以在我的本地 miniconda 虚拟环境(运行“heroku 本地网络”)上的 gunicorn 上正常运行,但是当部署在 heroku 上时,我不断收到“内部服务器错误”。当我查看日志时,看起来应用程序的内部变量(例如 app.suggested)没有被保留,因此当 accept_item 运行时,app.suggested 始终为空。为什么它们会保留在本地版本而不是 heroku 部署?

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

【问题讨论】:

    标签: python-3.x heroku flask gunicorn


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2019-03-15
      • 2021-11-09
      • 2021-06-07
      相关资源
      最近更新 更多