Flask,在cookie中设置JSON,并在客户端上对其进行解码(javascript)

Flask,在cookie中设置JSON,并在客户端上对其进行解码(javascript),javascript,python,json,cookies,flask,Javascript,Python,Json,Cookies,Flask,我在烧瓶里放了一块饼干,如下所示: response.set_cookie('notice', value = json.dumps(someObject), max_age=None) 如果我在服务器上打印json.dumps(someObject),我会得到: {"message": "hello", "type": "success"} 在客户端,它变成: "{\"message\": \"hello\"\054 \"type\": \"success\"}" 我想在javascri

我在烧瓶里放了一块饼干,如下所示:

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码)

Werkzeug库引用cookie值,以便在
cookie
标题中安全使用;这包括引用任何逗号、分号、双引号和反斜杠:

cookie_quoting_map = {
    b',' : b'\\054',
    b';' : b'\\073',
    b'"' : b'\\"',
    b'\\' : b'\\\\',
}

今天,除了字母、数字和字符以外,还有什么其他东西处理同样的问题,但事实似乎已经改变了

首先,发送回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;
在我的例子中,卷发似乎没有得到正确的转义。因此,我必须找到卷发并用转义版本
\{
\}
替换卷发。然而,之后,我不得不求助于jquery的$.parseJSON()函数,它返回一个可用的json对象,而不是使用getJSON

仍然没有弄清楚如何让cookie json字符串在不重新转义javascript端的curley字符串的情况下正确运行。转义和jquery方法有点粗糙…但它可以工作

我还在AWS Lambda中使用Zappa Flask,不确定这是否会弄乱我的cookie。

Flask(python)和javascript之间的双向JSON cookie 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 cookies。在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"

在客户端-你是说在javascript端吗?是的,我是说javascript,我更新了问题OK,这可能会有帮助:Base64编码不鼓励这种转义,应该使用Base64编码instead@Erbureth当前位置Werkzeug项目没有这样做是我的错?逃跑不是我的选择,OP也不能改变。我所做的只是记录说明项目做什么,以及如何再次解码。@erburat:我怀疑Werkzeug的维护人员对base64编码的这种机制有他们的原因(可能是因为base64为存储方法增加了大量开销,而这种存储方法已经限制了可用空间的大小)@MartijnPieters,这将使存储不适合此工作。OP可以通过将其包装到Base64中来解决此问题。@erburat:也许吧,但这完全是另一回事。
// 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"