2012-04-18 7 views
4

私はPythonスクリプトでオブジェクトをエンコードしようとしていて、クッキーとして設定していますので、クライアントサイドのJavaScriptで読むことができます。Google App EngineでPythonを使用してJSON形式の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\"}" 

になります。

カンマのインスタンスが表示されたときに置き換えるためのhack-yソリューションを導入したいとは思っていません。どのように私は複雑なデータ構造を渡すことができる任意のアイデア(クッキーを読むことによって)Pythonで?

+0

リクエストでクッキーを読んでいるときに、何が戻ってきますか? Cookieは、コ​​ード化されたのと同じ方法でデコードする必要があります。もしそうでなければ、どこかのクッキーライブラリにバグがあります。 –

+0

サーバー側で値を読み取ったときに正しい値を取得しています。しかし、それがクライアントに保存されると、それは奇妙な形式でエスケープされます。 – marclar

+0

エスケープは、HTTPヘッダーを使用してエスケープする必要があります。クライアント上でどのような形式で保存されているのが問題なのですか? –

答えて

2

また、クライアント上で(サーバーに設定されていた)クッキーを読み取ろうとしました。 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-base64https://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の側)

+0

ああ - 非常に賢い(そして良い答え、ありがとう)。私は現在カンマを '|'で置き換えていますカンマが問題を引き起こしているように見えるので、カンマを後で復元することができます。それはまたハッキーですが、今は十分です。あなたのアプローチはより良い長期的なハッキングかもしれないと思っています;) – marclar

0

これを行う最善の方法はクッキーではありませんか?クライアントへの情報レンダリングデータのgetting started guideを参照してください。

0

  1. json.dumps文字列
  2. エスケープスペース - ちょうどオン.replace(' ', '%20')
  3. コールurllib.quote_plus()その後、クッキーに文字列を書き込む

を呼び出しますJavaScript横:

  1. はそれはそれは

decodeURIComponent()

  • JSON.parseを通じてクッキー
  • パスを読んでこれは私が見つけたクリーンな方法のようです。

  • +0

    スペースを削除すると、クッキーの値が変更されることがあります。例えば{1: "こんにちは、世界!"} - > {1: "こんにちは、世界!"} – yndolok

    +0

    これはとても古いですが、あなたが正しいです、私は私の答えに小さな誤りがあったので、今修正されました。 (エスケープスペース、置き換えない) –

    関連する問題