我建立一個應用程序,可以幫助人們搜索升降機。我使用Django,Python2.7和谷歌地圖和方向API。
在一個視圖中,我使用地圖並允許用戶選擇幾個位置以及到達和離開時間。然後我使用Google Directions API來獲取點之間的幾條備選路線(如JSON)。我解析JSON並以多種方式修改返回的信息,並將數據保存在一個新的結構中(稱爲legs
)。直到這裏一切正常。
當用戶按下「下一個」按鈕時,legs
被串化並作爲表單的一部分發布到下一個視圖。像這樣:
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
在JSwindow.legs = JSON.parse(window.legs_json);
錯誤:
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
我考慮改變的上下文。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**
然後我得到的蟒蛇錯誤:
UnicodeEncodeError at /set_route/offer/0/
'ascii' codec can't encode character u'\xa9' in position 127: ordinal not in range(128)
的東西,我已經想到的
因爲我可以和字符串化解析對象後後,我可以在隨後的視圖解析生成的JSON我假設:發佈的JSON沒有正確傳遞(在這種情況下,有些中間件會受到責備),或者Python JSON模塊根據JSON.js期望的方式對事物進行不同的編碼(這確實非常令人不安)。
問題
是否有任何我對JSON的工作假設在Django和JavaScript的正確方式嗎? 如果是的話:我如何解決這個問題,並安全地實例化legs
? 如果否:發生了什麼問題?我怎樣才能安全地實例化legs
?