我正在阅读this part on logins from a Flask tutorial.
在此示例中,作者将User对象存储在g
global。
为什么他这样做?将登录的用户数据存储在session
全局上是否更有意义?我不应该使用session
来存储有关登录用户的数据吗?
答案 0 :(得分:0)
不,做你描述的事情是没有意义的。 Flask-Login 在会话中存储用户信息:它存储用户ID,以便在每个请求中加载完整用户。
如果您只是将用户数据存储在会话中,那么如果用户有两个以上的浏览器会话,或者用户数据发生了变化而发生在用户控制范围之外的情况,它就会失去同步。
您将User
个实例传递给Flask-Login的login_user
函数,它会将用户的ID存储在session
中。当下一个请求进入时,它将使用此存储的id调用user_loader
以再次检索用户实例。在请求期间,实例存储在g
中。
答案 1 :(得分:-1)
理论上,session
或g
可用于存储登录用户。
在Flask-Login中,session
cookie的主要目的是跟踪用户ID。 Flask-Login会在g
中的请求期间完成剩下的工作以获取和存储用户对象。
g
比session
更灵活。添加到session
的任何内容都必须是JSON可序列化的。 g
是一个Python对象,因此可以将任何数据(包括对象甚至函数)分配给它(g.user
,g.some_function()
等)并在请求期间使用。
默认情况下,session
中存储的所有数据都存储在由ItsDangerous安全签名的浏览器cookie中。每次请求时,浏览器都会将cookie发送到服务器。任何有权访问用户连接的人都可以拦截并读取其中的数据,但由于签名,他们无法更改。
相反,g
仅在每次请求期间存储在服务器内存中。用户或其他人不会看到任何数据。但是,它不是持久的,必须为每个请求重新创建。 session
Cookie会在请求中保留其数据。