如何在Google App Engine上使用Python发送JSON格式的Cookie数据?
问题内容:
我试图在Python脚本中编码对象并将其设置为cookie,以便可以使用客户端JavaScript读取它。
我尝试执行此操作的所有方式都遇到了问题。通常,以一种使JSON.parse()中断的方式格式化cookie。
我当前的脚本:
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)有什么想法?
问题答案:
我还想读取客户端上的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代码,但是这样做还有一个缺点,您需要注意并移植和更改该代码。
现在,我转到了一个解决方案,在该解决方案中,我使用一个小的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很小,大约是十二个字符)。