我正在阅读this part on logins from a Flask tutorial.在这个例子中,作者将用户对象存储在g
全局上。
他为什么这样做?将登录的用户数据存储在session
全局上是不是更有意义?我不应该使用session
来存储有关登录用户的数据吗?
不,做你描述的事情是没有意义的。 Flask-Login会在会话中存储用户信息:它存储用户ID,以便在每个请求中加载完整用户。
如果您只是将用户数据存储在会话中,那么如果用户有两个以上的浏览器会话,或者某些更改用户数据发生在用户控制范围之外,它就会失去同步。
您将User
实例传递给Flask-Login的login_user
函数,它将用户的id存储在session
中。当下一个请求进入时,它将使用此存储的id调用user_loader
以再次检索用户实例。该实例在请求期间存储在g
中。
理论上,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保留了跨请求的数据。