背景
我正在构建一个帮助人们搜索电梯的应用程序。我正在使用 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));
问题
legs
在下一个视图中,我似乎无法访问 JavaScript。所以我的问题是:如何legs
在下一个视图中获得相同的数据结构?
我试过的
方法一:
视图.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
安全地实例化?