使用Django set_cookie设置Cookie时逗号被替换为\054的问题
问题原因
这是Django的默认行为:set_cookie方法会自动对Cookie值进行RFC 6265规范兼容的转义,逗号属于Cookie定义中的保留字符(还包括分号、空格等),所以会被转义为八进制表示的\054(对应ASCII码中的逗号)。
解决办法
1. 直接读取自动解码(推荐)
Django在解析request.COOKIES时会自动反转义这些字符,无需手动处理,直接读取后解析即可:
import json # 读取Cookie的代码 blah_cookie = request.COOKIES.get('blah') if blah_cookie: x = json.loads(blah_cookie) # 此时x就是原始的字典结构
2. 关闭自动转义
如果需要Cookie值保持原始格式,可以在set_cookie时设置encode=None参数,禁用Django的自动转义功能。但需自行确保Cookie值不包含会破坏格式的保留字符:
x = { "key1": "value1", "key2": "value2", "key3": "value3", } response.set_cookie('blah', json.dumps(x), encode=None) return response
3. 使用Base64编码存储
若担心保留字符的格式问题,可先将JSON字符串用Base64编码后再存入Cookie,读取时解码还原:
import json import base64 # 设置Cookie x = { "key1": "value1", "key2": "value2", "key3": "value3", } json_str = json.dumps(x) encoded_str = base64.b64encode(json_str.encode()).decode() response.set_cookie('blah', encoded_str) return response # 读取Cookie blah_cookie = request.COOKIES.get('blah') if blah_cookie: decoded_str = base64.b64decode(blah_cookie).decode() x = json.loads(decoded_str)
内容的提问来源于stack exchange,提问作者Soumya
相关产品推荐
相关产品推荐

