我正在构建一个使用json-rpc与django后端通信的应用程序。到目前为止,一切都运作良好。但是我发现“”发送异常。据我所知,请求工作正常,但是django严重地解释了响应。我在下面复制了简化的请求和回复:
请求:
{"jsonrpc":"2.0","id":"1","method":"test","params":
{"id":"80","name":"tests","introduction":"hello there"}}
Django收到:
<QueryDict:u'{"jsonrpc":"2.0","id":"1","method":"test","params":
{"id":"80","name":"tests","introduction":"hello ': [u''], u'nbsp': [u''], u'there"}}': [u'']}>
预期回应:
<QueryDict: {u'{"jsonrpc":"2.0","id":"1","method":"test","params":
{"id":"80","name":"tests","introduction":"hello there"}}': [u'']}>
似乎django解释了&amp;而且;作为特殊字符,因此在其request.POST变量中创建了一个意外的字典。
我需要做些什么来确保json字符串不会格式错误?我尝试使用php htmlspecialchars()方法对其进行编码,但由于这不会删除'&amp;'问题依然存在。
非常感谢任何帮助。
答案 0 :(得分:1)
Django通过解码主体(你的json字符串)来处理(POST?)请求,好像它是一个查询字符串,而不是一个json。
在查询字符串中,&
和;
表示键:值对的结尾。在这两个字符上拆分您的请求主体会产生您在Django QueryDict中看到的键:值对。
您需要掌握POST请求正文并使用标准的lib json或simplejson模块将其显式解码为dict。
我对Django没什么经验,但我想你在视图处理程序的某个地方你会做类似的事情:
try:
data = json.loads(requesst.raw_post_data)
## work with the data...
except ValueError:
## do something...
毫无疑问,Django提供了一种方法来将这个json处理移出您的视图,并提供更合适的地方。