我正在使用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
答案 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。