2013-03-05 52 views
2

背景Django和JSON的POST與谷歌API的熱潮字符

我建立一個應用程序,可以幫助人們搜索升降機。我使用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

在JS
window.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

回答

1

鑑於JSON的定義是有效的Javascript,您可以簡單地將它轉儲到模板中作爲JS數據結構,而不是您隨後解析的字符串。

window.legs_json = {{legs}};