8

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\"}"

クライアントで。

コンマのインスタンスが表示されたときにそれを置き換えるハック的なソリューションを導入したくはありません。Python で複雑なデータ構造を (Cookieの設定読み取りの両方で) 渡す方法はありますか?

4

3 に答える 3

3

また、クライアントで (サーバーに設定された) 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-base64https://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 文字程度です)。

于 2012-04-25T04:32:50.020 に答える
2

Python側:

  1. json.dumps文字列
  2. エスケープスペース - 呼び出すだけ.replace(' ', '%20')
  3. 呼び出しurllib.parse.quote_plus()てから、文字列を Cookie に書き込みます

JavaScript側:

  1. クッキーを読む
  2. 通すdecodeURIComponent()
  3. JSON.parseそれ

これは私が見つけた最もクリーンな方法のようです。

于 2014-04-14T01:51:31.247 に答える
0

Cookie がこれを行う最善の方法であると確信していませんか? クライアントへのデータのレンダリングに関する情報については、入門ガイドを参照してください。

于 2012-04-19T00:58:00.623 に答える