我还想在客户端读取一个 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 非常小 - 十几个字符左右。)