我在Flask中设置了一个cookie,如下所示:
response.set_cookie('notice', value = json.dumps(someObject), max_age=None)
如果我在服务器上打印json.dumps(someObject),我得到:
{"message": "hello", "type": "success"}
在客户端,它变为:
"{\"message\": \"hello\"\054 \"type\": \"success\"}"
我想在javascript客户端解码它究竟是什么格式?
我想解码它并将其传递给angular.fromJson(), 它看起来至少有一些(“的”), 但我很惊讶地看到\ 054(逗号的八进制ASCII代码)
答案 0 :(得分:4)
Werkzeug库引用cookie值,以便在Cookie
标题中安全使用;这包括引用任何逗号,分号,双引号和反斜杠:
cookie_quoting_map = {
b',' : b'\\054',
b';' : b'\\073',
b'"' : b'\\"',
b'\\' : b'\\\\',
}
除了字母,数字和字符!#%&'~_`><@,:/$*+-.^|)(?}{=
之外的任何其他内容也被编码为八进制代码点。如果Cookie中有任何转义值,则整个Cookie也会被双引号括起来。
如果您需要在JavaScript中访问Cookie值,则必须再次对其进行解码。以斜杠和3位数字开头的值是八进制值; String.replace()
来电应该做:
function decode_flask_cookie(val) {
if (val.indexOf('\\') === -1) {
return val; // not encoded
}
val = val.slice(1, -1).replace(/\\"/g, '"');
val = val.replace(/\\(\d{3})/g, function(match, octal) {
return String.fromCharCode(parseInt(octal, 8));
});
return val.replace(/\\\\/g, '\\');
}
演示:
> // recreate properly escaped value
> var cookie = "\"{\\\"message\\\": \\\"hello\\\"\\054 \\\"type\\\": \\\"success\\\"}\""
> cookie
""{\"message\": \"hello\"\054 \"type\": \"success\"}""
> decode_flask_cookie(cookie)
"{"message": "hello", "type": "success"}"
> JSON.parse(decode_flask_cookie(cookie))
Object {message: "hello", type: "success"}
答案 1 :(得分:0)
今天处理同样的问题,但实际情况似乎发生了变化。
首先,将cookie发送回来就像:
cookie_str = json.dumps(mydictionary, separators=(',', ':'))
resp.set_cookie('cookiename', cookie_str, None, None, '/')
在Javascript方面,在浏览器中,我使用js-cookies项目按如下方式读取cookie:
var cookie2 = Cookies.noConflict();
var cookiejs = cookie2.getJSON('cookiename');
var one = ca.field1;
var two = ca.field2;
在我的情况下,似乎卷曲没有正确转义。因此,我必须使用转义版本\{
和\}
查找并替换curley。然而,在那之后,我不得不求助于jquery的$ .parseJSON()函数,而不是使用getJSON,它返回一个可用的json对象。
仍然没有弄清楚如何让cookie json字符串正常运行,而无需重新转移javascript端的curley。转义和jquery方法有点hacky ......但是它有效。
此外,我在AWS Lambda中使用Zappa-Flask,不确定这是否会弄乱我的cookie。
答案 2 :(得分:0)
Python-需要使用urllib进行解码
if "sensorcookie" in request.cookies:
ck = json.loads(urllib.parse.unquote(request.cookies.get("sensorcookie")))
else:
ck = {}
tz = "undefined" if os.environ.get("TZ") is None else os.environ.get("TZ")
ck = {"HOST_ENV":os.environ["HOST_ENV"], "TZ": tz, **ck}
resp.set_cookie("sensorcookie", json.dumps(ck))
Javascript-使用js-cookie。在JSON解析之前,必须替换转义的逗号和三倍的反斜杠。我已经构造了一个包装器“模块”来完成此操作
// https://yuiblog.com/blog/2007/06/12/module-pattern/
var sensorcookies = function () {
const defaultopts = {righttoleft:true, graphtype:"line", freq:"", pointsslider:100, pointstoplot:20, tickinterval:1, TZ:""};
const name = "sensorcookie";
function convertraw() {
var t = Cookies.get(name);
return (!t) ? defaultopts : { ...defaultopts, ...JSON.parse(t.replace(/\\054/g, ",").replace(/\\/g, ""))};
}
function privateget(attr) {
var opts = convertraw();
return opts[attr];
}
function privateset(attr, value) {
var opts = convertraw();
opts[attr] = value;
Cookies.set(name, JSON.stringify(opts));
}
// waitforcookies();
return {
version: "1.0",
get: (attr) => { return privateget(attr);},
set: (attr, value) => { privateset(attr, value);},
log: () => { Cookies.set(name, convertraw()); console.log(JSON.stringify(convertraw()));},
val: () => { return convertraw(); }
};
}(); // NB parens so makes it feel like a "module"