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 内存空间换速度的作用吗?
6287 次点击
所在节点    Python
30 条回复
zsz
2017-04-30 13:43:23 +08:00
@jy01264313 楼主的想把所有的 session,加密序列化放到 cookie 中,不同服务框架间在服务器端无状态情况下,怎么关联好呢
sagaxu
2017-04-30 13:44:29 +08:00
@zsz

user 服务只提供 client side session 的 encode 和 decode,其本身并不需要保存 session 的内容,使用 cookie 保存 session 并不是楼主想省内存,楼主是选了 flask,flask 默认行为如此,并非楼主意愿体现。

早期可能不需要考虑太多规模上去之后的事情,业务进化的过程中,技术层面也会不断迭代。初期根本不用考虑多语言协作,也不用关注流量和性能,那是日 PV 过了千万之后才要面对的事情。
zsz
2017-04-30 13:59:24 +08:00
@sagaxu 同意你的看法,楼主用默认的功能满足需求,暂时不需要考虑过复杂,系统一步步迭代就好
wwqgtxx
2017-04-30 14:08:00 +08:00
@zsz 而且实际上一般并不会遇到在同一个 session 下还跨语言吧,难道你 /a 和 /b 两个路径下还用了不同的后端来实现?
wwqgtxx
2017-04-30 14:11:39 +08:00
而且如果真的要实现跨后端 session 就单独用一个 cookie 来保存一个 session id,然后后端用 redis 或者 memcache 共享呗,不过要使用一种通用的序列化方式来保存 session 内容,比如 json 或者 yaml
zsz
2017-04-30 14:21:31 +08:00
@wwqgtxx 亲身参与过的几个系统都有这个问题,现实世界也比较难按单个团队的想法去整合,基本还是按照你说的后一种做法 cookie 保存 sid 对接的
kaneg
2017-04-30 15:54:58 +08:00
以上几位差不多都说的很清楚了,Flask 的确是用 cookie 来保存 session 的,是比较奇特的一种方式,但不用担心安全问题,因为已经加密过了,但记得修改默认密钥。

不过因为是 cookie 存储,所以有浏览器的大小限制,已经存储的对象还得能够序列化和反序列化。除此之外,如果存储太多,来回传输也影响效率。所以 Flask 的作者建议尽量不要往 session 里保存太多东西,不要把 session 当缓存用,而只应该保存关键的 key,比如用户 ID,name 等。
node
2017-04-30 21:20:54 +08:00
前面有几位回答得挺全面的,直接回答楼主的问题吧,如果不考虑可篡改性的问题,默认 session 和 request.cookies 没太大区别,但 flask 的 session 是个通用框架,建议的做法是把 session 换成存储在服务器端的实现,因为 cookies 请求来回都得带上,数据都带在里面流量浪费了
ryd994
2017-05-01 13:26:21 +08:00
flask 这个 session 就是个脚手架,给你小规模和测试用起来方便而已
想要换成基于服务器的 session 就是几行代码的事
你现在全放 cookie 里的话,将来改服务端 session 就难了
geek123
2018-03-07 11:53:38 +08:00
推荐一个 flask 的入门教程给大家:
[深入浅出 flask](url=http://xc.hubwiz.com/course/562427361bc20c980538e26f?affid=v2ex20180307)

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

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

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

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

© 2021 V2EX