【问题标题】:How to store User's Data for Session in Flask?如何在 Flask 中存储用户的会话数据?
【发布时间】:2017-12-22 13:20:44
【问题描述】:

我正在创建一个 Flask 应用程序,它要求每个请求都使用用户传递给应用程序的一些数据来初始化他们的会话。一旦他们传递了该数据并初始化了会话,我想一遍又一遍地重复使用该数据,直到他们的会话完成以填充请求,而不必为每个请求传递数据。

我似乎无法找出最好的方法来做到这一点。将其存储在会话变量中不起作用,因为该数据只是被发送回用户,然后它与每个请求都传递它相同。将数据存储在数据库中似乎不是正确的选择,因为我需要在会话结束时将其丢弃,而且我没有看到任何装饰器可以在会话到期时实现......所以我担心我的数据库最终会填满所有这些来自初始化的数据,并且无法保证在会话结束时删除它们。

有什么建议吗?

【问题讨论】:

标签: python mongodb flask


【解决方案1】:

这里有两种选择:存储在客户端的会话,或存储在服务器上的会话。

要将其存储在服务器上,您需要一个数据存储。如果您的应用程序必须扩展到任何程度(包括多个 uwsgi 工作人员),您将必须使用分布式存储。如果你有redis,那将是最好的选择。请参阅 Simon Fraser 在 cmets 中发布的 Flask-Session 示例来执行此操作。它将处理将会话对象存储在数据库中并在需要时从中获取值。它还可以处理大量后端,因此您拥有的任何数据库都可能开箱即用。

如果您不想使用后端会话,则必须使用客户端会话。这是通过设置 cookie 来完成的——cookie 会自动附加到浏览器发送到您网站的大多数请求中,因此您存储在 cookie 上的值通常会返回给您。 (这就是 facebook 在没有你登录每个页面的情况下记住你是谁的方式。事实上,这是 Flask-Session 跟踪要恢复的会话的方式!)。为了使其可靠,您必须对 cookie 进行签名,以便用户无法修改值 - Flask 可以使用内置的 Session 为您处理这个问题,或者您可以使用更好的加密库,如 @987654322 所述@。如果您不希望用户能够看到这些值,或者如果您有大量数据要存储(cookie 的最大大小是有限的),您将不得不使用所有这些的服务器端版本.

【讨论】:

  • 感谢您的回复。我已经将会话变量与 cookie 一起使用,但问题是我最终为每个请求发送了巨大的 20,000 字节数据,而不是实际将其存储在会话端并随后将其用于所有请求。当我考虑为我的会话数据使用 mongodb 或 redis 时,我不知道如何在会话结束时清除该会话数据。似乎没有任何装饰器可以运行以进行会话拆除,以便在不再需要时可以清除 redis/mongodb 的会话数据。
  • 你永远不知道会话何时结束——你不知道用户在请求之间在浏览器中做了什么。如果这对您的应用有意义,您可以在“注销”功能中清空会话。可能更中肯,你可以在 redis 中的数据上设置一个简短的 ETL,让数据库为你处理清理。
  • 对,我知道我不知道会话何时结束。为了解决这个问题,我将会话生命周期设置为 5 分钟,并且每次用户执行请求时都会刷新该时间。所以实际上,我知道会话将在他们最后一次请求后 5 分钟结束。我很好奇是否有办法在会话超时时处理拆卸?当您说 ETL 时,您是指提取/转换/加载还是其他我不知道的特定于这些数据库的机制?
  • 对不起,我的意思是说 TTL,我猜我脑子里有 ETL。 Redis 将允许您在设定的时间(使用 TTL)选项后使值过期。使用 Mongo 还不够了解它是否提供类似的功能。
  • 应该可以。我认为我需要做的就是为每个请求刷新 TTL,它将与会话超时同步。感谢您的帮助!介意在您的第一个答案中添加此信息以供其他人查看吗?
猜你喜欢
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 2016-09-24
  • 2021-05-22
相关资源
最近更新 更多