Flask 中通过 session 或 cookie 传值,有什么区别吗?

2017-04-30 08:06:15 +08:00
 rogwan
flask 中的 session 是 cookie based 的,既然 session 都要被复制一份存到 cookie 里,那还有必要用 session 传值吗?存进 session 里的值还占用内存,直接全存放 cookie 里不就好了吗?

实际使用中总感觉 session get 取值,比 request cookies get 取值的方式,程序要跑的流畅和快一点。这 TM 是心理作用?还是真的是这样( 是 session 的值更新还要 response 一下到 cookie 里的缘故?) flask 中用 session 传值也可以起到用 server 内存空间换速度的作用吗?
6077 次点击
所在节点    Python
30 条回复
zsz
2017-04-30 08:33:26 +08:00
@rogwan 首先 cookie 里面仅仅存放了 session ID,session 本身是不会传到客户端的,然后你再理清楚方案思路
rogwan
2017-04-30 08:42:27 +08:00
@zsz Flask 是把 session 的值以 json 格式重新编码存入 cookie 里,应该不仅仅是 session ID。我理解的对吗?
zsz
2017-04-30 08:56:53 +08:00
session id 一般是一个全局唯一的编号,用算法生成的,例如 guid,访问量规模小的话 crc32,crc64,看你自己的实现

加我们的群问效率更高,一群工程师组建的面向初学者的
Python Linux 学习群,qq 群号:278529278,
Php Linux 学习群,qq 群号:476648701,
非商业性质,拒绝广告,只接收真正想学这方面技术的朋友,交流学习,申请请说明来自 v2ex
gyorou
2017-04-30 09:00:09 +08:00
基本的 web 常识。

session 存储的方式有很多。比如 cookie,redis,memcache,服务器端文件等等。除了 cookie 存储以外,cookie 中一般只保持 session 的 id 用来获取存储在别处的 session。

采用 cookie 存储 session 的策略的话,session 会被 serialize 之后存到 cookie 里面,所以一般来说没有获取用来序列化这个 session 的暗号的用户,是无法知道 session 里面存的什么内容的。于是一些不允许用户擅自修改的东西可以存到 session 之中。而无所谓用户修改不修改的内容则可以直接存到 cookie 中。
wwqgtxx
2017-04-30 09:31:04 +08:00
楼上的 @zsz @gyorou 真的看过 flask 的实现么?
flask 默认的 session 实现是把 session 处理过之后直接保存到 cookie 中,也叫客户端 session,并不是保存 session id
如果要实现 cookie 中仅仅保存 session id,请使用 flask-session 扩展

保存在 session 中的好处是客户端无法修改(就算是 flask 默认的客户端 session 实现也是加了校验的,如果用户自行修改会被直接拒绝),这样保存用户的登录验证信息的安全性会大大提高
另外就是以后如果你想把 session 保存在 redis memcache 之类的存储中也能快速切换
lxy
2017-04-30 09:34:31 +08:00
类似的一般 Session 实现

TheCure
2017-04-30 09:41:25 +08:00
@wwqgtxx 对的

之前的两个哥们都答错了,水平不敢恭维
flask 默认的 session 实现其实就是 TMD cookie
KKKKKK
2017-04-30 09:51:39 +08:00
flask 的 session 不同于其他的实现,完全卸载 cookies 里面的, 用的是他自己写的一个库 itsdangerous 来加密。
gyorou
2017-04-30 09:58:19 +08:00
@wwqgtxx 特么我说得哪里有问题。
gyorou
2017-04-30 10:04:43 +08:00
@callofmx 啊呵呵,首先我没有说错,其次请你学会尊重别人的热心回答,再其次,就你下面的理解其实很片面很有可能是错的。
Citrus
2017-04-30 10:07:05 +08:00
还是有点区别,你直接操作 Cookie 需要自己考虑加解密,但是用 session 的话,加解密逻辑是 Flask 帮你做的。
wwqgtxx
2017-04-30 10:47:27 +08:00
@gyorou sorry,手滑多 at 了一个,你的解释其实并没有啥问题,不过上面那个 zsz 就完全是在误导了
wwqgtxx
2017-04-30 10:49:22 +08:00
@callofmx flask 的 session 只不过是用 cookie 实现的,并不就等同于 cookie,楼上的 @KKKKKK 也提到了,是用 itsdangerous 处理过后才放进 cookie 的,这样就不像 cookies 可以被用户直接修改了
kfll
2017-04-30 11:24:43 +08:00
Cookie 处理 HTTP 无状态问题
Session 解决状态安全和控制问题
zsz
2017-04-30 11:48:34 +08:00
@callofmx 我前面说的是一般情况,一般稍微复杂些的系统会有多系统联合登陆等问题,单纯 flask 放 session 进去没问题,但涉及到不同语言开发的系统还是建议只保存唯一标志在 cookie 中,其他系统识别处理 cookie 中的 session 应该是有难度的,除非有一套统一的设计,有说错的地方见谅
sagaxu
2017-04-30 12:51:16 +08:00
@zsz 不同语言开发,应该把 user 作为一个服务了吧,请求 flask 提供的 user 服务,取回 decode 过的 session,没难度啊
guyskk
2017-04-30 13:07:36 +08:00
@wwqgtxx #5 正解
zsz
2017-04-30 13:20:30 +08:00
@sagaxu 如果只是简单的 decode,那就是通过 cookie 带出带回数据,请求 flask 提供的 user 服务就还是要在服务端保存用户登录的信息,楼主是想把所有的 session 信息编码在 cookie 中,节省服务器上的内存,这些数据需要频繁的带入带出,而客户端又不读取,规模上去后有不小的流量损耗,而且 session 中一般保存一些状态信息,完全传到客户端是有安全隐患的
jy01264313
2017-04-30 13:28:40 +08:00
@wwqgtxx 正解+1
jy01264313
2017-04-30 13:33:18 +08:00
@zsz 而且你说的多系统联合登陆,cookie 本身是不能跨域的。而且和 flask 没关系,我见过绝大部分的框架都支持不同的 session 保存方式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/358185

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX