我如何发送使用Python的谷歌应用程序引擎JSON格式的Cookie数据?(How can I s

2019-06-23 18:31发布

我试图编码在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\"}"

在客户端上。

我真的不希望引入一个黑客-Y解决方案时出现,他们更换逗号的实例。 任何想法如何,我可以通过复杂的数据结构(包括通过设置读取Cookie)与Python?

Answer 1:

我也想读一个Cookie(已被设置在服务器上)在客户端上。 我工作围绕这一问题通过编码JSON字符串的base64,但有这种方法涉及以及一些小陷阱。

1:Base64的串结束0-2个等号,将它们转换成字符串\ 075。 我的做法是对这些字符还原到客户端上的平等字符。

2:基于64位字符串被封闭在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

注:我认为这是一个黑客:这将是更好地重新实现编码在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:Cookies是不理想的我的使用情况下,我可能会移动到会话或本地存储,以减少网络开销(虽然我的nav_data是相当小的 - 十字符左右。)



Answer 2:

不知道一个cookie是这样做的最佳方式? 看到入门指南的信息数据呈现到客户端



Answer 3:

Python端:

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

JavaScript端:

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

这似乎是我发现的最彻底的方法。



文章来源: How can I send JSON-formatted cookie data using Python on Google App Engine?