Flask会话不是JSON序列化cookie

时间:2014-02-18 15:41:30

标签: python session cookies flask python-2.6

我正在使用Flask的会话,该会话在响应中设置了签名的cookie标头。

from flask import session

这会将名为session的cookie设置为a = 1

a = session.get('a', None)
session['a'] = 1
return jsonify(a = a)

代码中的jsonify只是为了表明在下一个请求时正在读取cookie,它就是。这是对第二个请求的响应

{
  "a": 1
}

我需要在客户端读取cookie。所以我希望它是JSON编码的。这是响应中的Set-Cookie标头

Set-Cookie: session=eyJhIjoxfQ.BeUPPQ.Al5bwLzcAsN2f15mdREzhGWP1uc; HttpOnly; Path=/

它不是JSON序列化的。

Flask版本为0.10.1。从版本0.10开始,它使用来自itsdangerous的会话,其主要优点是JSON序列化cookie而不是之前使用的Pickle序列化。

我错过了什么? Flask版本为0.10.1

1 个答案:

答案 0 :(得分:4)

您误解了默认Flask会话实现的格式。 session对象生成加密签名的JSON,然后(可选)进行压缩,然后进行base64编码以存储会话值,确保客户端不会篡改存储在其中的值。在您的情况下,不应用压缩(仅在减少最终输出大小时才应用压缩)。

这是使用pickle从以前的格式进行的更改,以限制攻击者在服务器端机密被泄露时可以造成的损害(请参阅blog post of mine为什么pickle可能有危险)

换句话说,Flask所做的就是将序列化程序从pickle换成扩展标记的JSON格式,但已经存在加密签名和压缩。

因此格式不适合在客户端再次解码(您必须解码base64,可能解压缩数据,拆分签名,您可能必须解释额外的类型标记)。您可以为此切换会话实现,但这是非常不推荐的。

如果您想与客户端共享数据,您只需将数据嵌入<script> var session_data = {{data|tojson|safe}};块中的{{1}}页面,或者将数据设置为单独的Cookie。