如何在Google App Engine上使用Python发送JSON格式的cookie数据?

时间:2012-04-18 23:30:34

标签: python json google-app-engine webapp2

我正在尝试在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)?

3 个答案:

答案 0 :(得分:2)

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

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代码,但是这也有缺点,你需要注意并移植和更改该代码。< / p>

我现在已经转移到一个解决方案,我使用一个小的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不适合我的用例,我可能会继续使用会话或本地存储来减少网络开销(虽然我的nav_data非常小 - 大约十几个字符。)

答案 1 :(得分:0)

不确定Cookie是最好的方法吗?请参阅getting started guide以获取客户端的信息呈现数据

答案 2 :(得分:0)

Python 方面:

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

    1. 阅读cookie
    2. 通过decodeURIComponent()
    3. 传递
    4. JSON.parse
    5. 这似乎是我找到的最干净的方式。