8

我正在尝试在 Python 脚本中编码一个对象并将其设置为 cookie,以便我可以使用客户端 JavaScript 读取它。

我尝试这样做的每一种方式都遇到了问题。通常,cookie 的格式会导致 JSON.parse() 中断。

我当前的脚本:

cookie = Cookie.SimpleCookie()
data = {"name": "Janet", "if_nasty": "Ms. Jackson"}
cookie['test'] = json.dumps(data)
self.response.headers.add_header("Set-Cookie", cookie.output(header=''))

...这导致

test="{\"name\": \"janet\"\054 \"if_nasty\": \"Ms. Jackson\"}"

在客户端。

我真的不想引入一个 hack-y 解决方案来替换逗号出现时的实例。任何想法如何使用 Python 传递复杂的数据结构(通过设置读取 cookie)?

4

3 回答 3

3

我还想在客户端读取一个 cookie(已在服务器上设置)。我通过对 JSON 字符串进行 base64 编码解决了这个问题,但是这种方法也涉及到一些小问题。

1:Base64 字符串以 0-2 等号结尾,这些被转换为字符串 \075。我的方法是将这些字符还原为客户端上的相等字符。

2:base64 字符串在 cookie 中被双引号括起来。我在客户端上删除了这些。

服务器:

nav_json = json.dumps(nav_data)
nav_b64=base64.b64encode(nav_json)
self.response.set_cookie('nav_data', nav_b64)

客户:

var user_data_base64= $.cookie('nav_data');
// remove quotes from around the string
user_data_base64 = user_data_base64.replace(/"/g,"");
// replace \075 with =
user_data_base64 = user_data_base64.replace(/\\075/g,"=");
var user_data_encoded=$.base64.decode( user_data_base64 );
var user_data = $.parseJSON(user_data_encoded);

我在这里使用 2 个 jquery 插件: https ://github.com/carlo/jquery-base64 和 https://github.com/carhartl/jquery-cookie

注意:我认为这是一个 hack:最好重新实现在 javascript 中编码 cookie 的 python 代码,但这也有缺点,您需要注意并移植和更改该代码。

我现在已经转移到一个解决方案,我使用一个小的 html 文件在客户端设置 cookie,然后重定向到请求的实际页面。这是我正在使用的 JINJA2 模板的一个片段:

<script type="text/javascript">
var nav_data='{% autoescape false %}{{nav_data}}{% endautoescape %}';
$.cookie('nav_data', nav_data, { path: '/' });
window.location.replace("{{next}}")
</script>

注意 2:Cookie 不适合我的用例,我可能会转向 Session 或 Local Storage 以减少网络开销(尽管我的 nav_data 非常小 - 十几个字符左右。)

于 2012-04-25T04:32:50.020 回答
2

Python方面:

  1. json.dumps字符串
  2. 逃生空间 - 只需调用.replace(' ', '%20')
  3. 调用urllib.parse.quote_plus()然后将字符串写入cookie

JavaScript方面:

  1. 读取 cookie
  2. 通过它decodeURIComponent()
  3. JSON.parse

这似乎是我找到的最干净的方式。

于 2014-04-14T01:51:31.247 回答
0

不确定 cookie 是不是最好的方法?有关向客户端呈现数据的信息,请参阅入门指南

于 2012-04-19T00:58:00.623 回答