带有 Google API ***字符的 Django 和 JSON POST

Posted

技术标签:

【中文标题】带有 Google API ***字符的 Django 和 JSON POST【英文标题】:Django and JSON POSTs with Google API craze characters 【发布时间】:2013-02-19 17:14:33 【问题描述】:

背景

我正在开发一款帮助人们搜索电梯的应用。我正在使用 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 数据结构?

我的尝试

方法一:

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

【问题讨论】:

【参考方案1】:

鉴于 JSON 根据定义是有效的 Javascript,您可以简单地将其作为 JS 数据结构转储到模板中,而不是您随后解析的字符串。

window.legs_json = legs;

【讨论】:

以上是关于带有 Google API ***字符的 Django 和 JSON POST的主要内容,如果未能解决你的问题,请参考以下文章

来自 Google Vision API OCR 的响应 400,带有指定图像的 base64 字符串

带有 Google PHP SDK 的 YouTube API - 以 JSON 格式响应

带有 Google 登录帐户的 Google API

带有 Chrome 扩展的 Google 日历 API

带有 Google 日历的 Notion API

带有 Google JavaScript 客户端库的 Google Contacts API