我应该在`g`或`session`上存储登录的用户数据吗?

时间:2015-10-09 23:12:54

标签: python session flask

我正在阅读this part on logins from a Flask tutorial. 在此示例中,作者将User对象存储在g global。

为什么他这样做?将登录的用户数据存储在session全局上是否更有意义?我不应该使用session来存储有关登录用户的数据吗?

2 个答案:

答案 0 :(得分:0)

不,做你描述的事情是没有意义的。 Flask-Login 在会话中存储用户信息:它存储用户ID,以便在每个请求中加载完整用户。

如果您只是将用户数据存储在会话中,那么如果用户有两个以上的浏览器会话,或者用户数据发生了变化而发生在用户控制范围之外的情况,它就会失去同步。

您将User个实例传递给Flask-Login的login_user函数,它会将用户的ID存储在session中。当下一个请求进入时,它将使用此存储的id调用user_loader以再次检索用户实例。在请求期间,实例存储在g中。

答案 1 :(得分:-1)

理论上,sessiong可用于存储登录用户。

在Flask-Login中,session cookie的主要目的是跟踪用户ID。 Flask-Login会在g中的请求期间完成剩下的工作以获取和存储用户对象。

gsession更灵活。添加到session的任何内容都必须是JSON可序列化的。 g是一个Python对象,因此可以将任何数据(包括对象甚至函数)分配给它(g.userg.some_function()等)并在请求期间使用。

默认情况下,session中存储的所有数据都存储在由ItsDangerous安全签名的浏览器cookie中。每次请求时,浏览器都会将cookie发送到服务器。任何有权访问用户连接的人都可以拦截并读取其中的数据,但由于签名,他们无法更改。

相反,g仅在每次请求期间存储在服务器内存中。用户或其他人不会看到任何数据。但是,它不是持久的,必须为每个请求重新创建。 session Cookie会在请求中保留其数据。