また、クライアント上で(サーバーに設定されていた)クッキーを読み取ろうとしました。 JSON Stringをエンコードするbase64で問題を解決しましたが、このアプローチにもいくつかの小さな問題があります。
1:Base64文字列は0-2の等号で終わり、これらは文字列\ 075に変換されています。私のアプローチは、クライアント上でそれらの文字を等しい文字に戻すことです。
2:base64文字列がクッキーの中に二重引用符で囲まれています。私はクライアント上でこれらを削除します。
サーバー:
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
注:私はこのハックを検討:それは希望をjavascriでCookieをエンコードするPythonコードを再実装する方がよいしかし、これには注意し、移植してそのコードに変更する必要があるという欠点もあります。
私は今、小さなHTMLファイルを使用してクライアント側でCookieを設定し、要求された実際のページにリダイレクトするソリューションに移行しました。
<script type="text/javascript">
var nav_data='{% autoescape false %}{{nav_data}}{% endautoescape %}';
$.cookie('nav_data', nav_data, { path: '/' });
window.location.replace("{{next}}")
</script>
注2:ここで私が使用していますJinja2のテンプレートからの抜粋です私のnav_dataが(クッキーは私のユースケースには理想的ではないと私はおそらく、ネットワークのオーバーヘッドを減らすために、セッションやローカルストレージに移動します非常に小さいです - 十数文字程度です。Pythonの側)
リクエストでクッキーを読んでいるときに、何が戻ってきますか? Cookieは、コード化されたのと同じ方法でデコードする必要があります。もしそうでなければ、どこかのクッキーライブラリにバグがあります。 –
サーバー側で値を読み取ったときに正しい値を取得しています。しかし、それがクライアントに保存されると、それは奇妙な形式でエスケープされます。 – marclar
エスケープは、HTTPヘッダーを使用してエスケープする必要があります。クライアント上でどのような形式で保存されているのが問題なのですか? –