2

バックグラウンド

私は人々がリフトを検索するのを助けるアプリを構築しています。私はDjango、Python2.7、Googleマップとルート案内APIを使用しています。

1つのビューでは、地図を使用して、ユーザーが到着時刻と出発時刻だけでなく、いくつかの場所を選択できるようにします。次に、Google Directions APIを使用して、ポイント間のいくつかの代替ルートを(JSONとして)取得します。JSONを解析し、返される情報をさまざまな方法で変更し、データを新しい構造(と呼ばれるlegs)に保存します。ここまではすべて正常に動作します。

ユーザーが「次へ」ボタンを押すと、legs文字列化され、フォームの一部として次のビューにPOSTされます。そのようです:

document.getElementById('legs_field').value = JSON.stringify(window.legs);

この行が正常に機能することも注目に値します。

JSON.parse(JSON.stringify(window.legs));

問題

legs次のビューでJavaScriptにアクセスできないようです。legsだから私の質問は本当にです:次のビューで同じデータ構造にアクセスするにはどうすればよいですか?

私が試したこと

アプローチ1:

view.py

legs_json = request.POST.get('legs')
legs = json.loads(legs_json)
arbitrary_processing()
return render_to_response('foo.html',{
        'legs': SafeString(json.dumps(legs)),
        **snipped for brevity**
     })

レンプレート

window.legs_json = '{{legs}}';
**snipped for brevity**

js

window.legs = JSON.parse(window.legs_json);

jsのエラー:

SyntaxError: JSON.parse: bad escaped character

私は以前にJSONを扱うときにこの正確な手法を使用しましたが、正常に機能しました。だから私はいくつかのクレイジーなキャラクターのものが起こっていると思います。

アプローチ2

SafeStringがエスケープを行うので、私はそれを取り除きました...

view.pyのコンテキストを次のように変更しました:

'legs': json.dumps(legs),
**snipped for brevity**

jsのエラー:

SyntaxError: JSON.parse: expected property name or '}'

これは予想されます。

アプローチ3

view.pyのコンテキストを次のように変更しました:

'legs': legs_json,
**snipped for brevity**

jsのエラー:

SyntaxError: JSON.parse: expected property name or '}'

これも期待されます

アプローチ4

view.pyのコンテキストを次のように変更しました:

'legs': SafeString(legs_json),
**snipped for brevity**

次に、Pythonエラーが発生します:

UnicodeEncodeError at /set_route/offer/0/
'ascii' codec can't encode character u'\xa9' in position 127: ordinal not in range(128)

私が考えたもの

POST後にオブジェクトを文字列化して解析でき、次のビューで結果のJSONを解析できるため、POSTされたJSONが正しく送信されていない(この場合、一部のミドルウェアが原因である)か、Pythonのいずれかであると想定します。 jsonモジュールは、JSON.jsが期待する方法とは異なる方法で物事をエンコードします(これは確かに非常に戸惑うでしょう)。

質問

DjangoとJavaScriptの観点からJSONの動作に関する私の仮定は正しいですか?legsはいの場合:問題を回避して安全にインスタンス化するにはどうすればよいですか?いいえの場合:実際に何が問題になっていますか?そして、どうすればlegs安全にインスタンス化できますか?

4

1 に答える 1

1

JSON は定義上有効な Javascript であるため、解析する文字列ではなく、単純に JS データ構造としてテンプレートにダンプできます。

window.legs_json = {{legs}};
于 2013-03-05T11:02:38.993 に答える