【问题标题】:How to pass complex objects across view functions/sessions in Flask如何在 Flask 中跨视图函数/会话传递复杂对象
【发布时间】:2013-09-18 13:04:21
【问题描述】:

我正在编写一个 Web 应用程序,当(且仅当)用户登录时,它会从第三方服务器接收大量数据。这些数据被解析为自定义对象并存储在 list() 中。现在用户在整个应用程序中使用这些数据,调用不同的视图(例如发送不同的请求)。 我不确定在视图函数之间传递对象列表的最佳模式是什么

我在技术上看到了两种可能性,但在我的情况下两者都有缺点:

  1. 会话字典:在会话中存储数据是多余的(整个列表将在每次请求时在服务器和浏览器之间来回发送)
  2. 持久化:将数据临时持久化到数据库似乎更合适。但我希望根本不必使用数据库(除了这个临时数据,我没有任何需要在本地存储的数据。其他所有数据都是从第三方服务器接收并发送回它)。

我不是一个经验丰富的 Web 开发人员,所以也许我会监督显而易见的事情。 那么还有另一种方法可以在请求之间传递数据吗?也许一些内置的烧瓶魔法或持久化(到文件或数据库)真的是唯一的选择吗?

【问题讨论】:

    标签: python flask


    【解决方案1】:

    虽然 Flask 的会话默认实现是将数据存储在 cookie 中,但这并不是唯一的方法。通常,您将会话 ID 存储在 cookie 中,数据本身存储在服务器上的某个位置并通过该 cookie 进行检索。

    Flask 确实为您提供了一种覆盖默认会话实现的简单方法,并且有各种方法可以展示如何做到这一点 - here's 一个显示大纲的 SO 问题。

    【讨论】:

      【解决方案2】:

      您可以使用Flask-Cache (flask.ext.cache)SimpleCache(实际上是werkzeug.contrib.cache.SimpleCache)将数据存储在应用程序的内存中。唯一的问题是每个服务器进程会有一个缓存实例(如果你在 uwsgi 之后,或者在 mod_wsgi 上运行,你很可能会有多个进程处理请求)。因此,用户可能会访问应用程序的一个端点,为获取数据付出代价,然后在下一个请求中,访问不同的进程并且必须再次支付该成本(因为进程 A 缓存了数据,过程 B 没有)。

      解决这个问题的唯一方法是使用进程外存储(父进程上的缓存或充当缓存服务器或某些持久性存储的单独 Python 进程 [Redis、PostGres 等)。 ])

      【讨论】:

      • 谢谢。我将使用 Redis 覆盖默认会话实现,感谢您的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 2010-12-28
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多