また、クライアントで (サーバーに設定された) 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
注: 私はこれをハックと考えています: 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 は私のユース ケースには理想的ではありません。ネットワーク オーバーヘッドを削減するために、おそらくセッションまたはローカル ストレージに移行します (ただし、私の nav_data は非常に小さく、12 文字程度です)。