使用Google API的Django和JSON POST热衷于角色

时间:2013-03-05 10:30:54

标签: javascript django json post google-direction

背景

我正在构建一款帮助人们搜索升降机的应用。我正在使用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安全地实例化?

1 个答案:

答案 0 :(得分:1)

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

window.legs_json = {{legs}};