背景
我正在构建一款帮助人们搜索升降机的应用。我正在使用Django,Python2.7以及Google地图和路线API。
在一个视图中,我使用地图并允许用户选择几个位置以及到达和离开时间。然后我使用Google Directions API在点之间抓取一些替代路线(作为JSON)。我解析JSON并以多种方式更改返回的信息,并将数据保存在一个新结构中(称为legs
)。直到这里一切正常。
当用户按下“下一步”按钮时,legs
会被字符串化并作为表单的一部分发布到下一个视图。像这样:
document.getElementById('legs_field').value = JSON.stringify(window.legs);
也许值得注意的是,这条线路工作正常:
JSON.parse(JSON.stringify(window.legs));
问题
我似乎无法在下一个视图中访问JavaScript legs
。所以我的问题是:如何在下一个视图中访问相同的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,我假设:POSTed JSON没有正确通过(在这种情况下,某些中间件应该受到责备),或者Python json模块对JSON.js的预期方式进行不同的编码(这确实非常令人不安)。
问题
我对Djang和JavaScript的JSON工作方式有任何假设吗?
如果是:我如何解决问题并安全地实例化legs
?
如果否:实际出现了什么问题?我怎样才能legs
安全地实例化?
答案 0 :(得分:1)
鉴于JSON根据定义是有效的Javascript,您只需将其作为JS数据结构转储到模板中,而不是随后解析的字符串。
window.legs_json = {{legs}};