如何在Flask中的视图函数/会话中传递复杂对象

时间:2013-09-18 13:04:22

标签: python flask

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

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

Flask确实为您提供了一种覆盖默认会话实现的简便方法,并且有各种方法可以显示如何执行此操作 - here's显示大纲的SO问题。