Python 解析POST json消息Django/GAE时出现问题

Python 解析POST json消息Django/GAE时出现问题,python,django,google-app-engine,post,Python,Django,Google App Engine,Post,当我使用POST向GAE发送带有json参数的POST消息时,服务器解析的QueryDict不像json那样被解析 我在这个问题上发现了类似的问题: 可能是GAE配置有问题。我已经介绍了Python2.6.6和GAE的最新版本。首先,如果我使用nc工具获取帖子,帖子信息是完美的: POST /url/ HTTP/1.1 Accept: application/jsonrequest Content-type: application/json Accept-Encoding: gzip Cont

当我使用POST向GAE发送带有json参数的POST消息时,服务器解析的QueryDict不像json那样被解析

我在这个问题上发现了类似的问题:

可能是GAE配置有问题。我已经介绍了Python2.6.6和GAE的最新版本。首先,如果我使用nc工具获取帖子,帖子信息是完美的:

POST /url/ HTTP/1.1
Accept: application/jsonrequest
Content-type: application/json
Accept-Encoding: gzip
Content-Length: 458
Host: 192.168.1.1:8080
Connection: Keep-Alive

{"id":"xxx","jsonrpc":"2.0","method":"XXX","params":{...}]}
在服务器控制台中,我收到以下消息:

DEBUG    2010-09-16 06:47:05,891 dev_appserver.py:1693] Access to module file denied: /usr/lib/pymodules/python2.6/simplejson
DEBUG    2010-09-16 06:47:05,894 dev_appserver.py:1700] Could not import "_json": Disallowed C-extension or built-in module
DEBUG    2010-09-16 06:47:05,897 dev_appserver.py:1700] Could not import "_json": Disallowed C-extension or built-in module
你有什么想法

服务器中的查询dict是

您可以检查django处理程序,将POST请求的json解析为新字典的键

在链接的问题中有下一个解决方案

hack_json_value = request.POST.keys()[0]
hack_query_dict = json.loads(hack_json_value)
foo = hack_query_dict['foo']
bar = hack_query_dict['bar']
但也许你能帮我找到另一个


谢谢,

使用json时需要记住的第一件事是AppEngine使用python 2.5。这意味着json还不是python的标准部分

为了解决这个问题,我在网上的某个地方找到了simplejson,并将其与我的代码打包在一起。内置json和simplejson的API本质上是相同的(或者我只是没有注意到任何不同),所以只需像这样导入它:

import simplejson as json
像你习惯的那样使用它

现在,关于QueryDict。是的,您得到的是原始POST数据,没有逻辑上的理由将其解析为json并假装它是一个基于查询的正常POST请求。老实说,我从没想过django能为我们做出这样的判断。因此,要获取数据,请使用以下内容:

data = json.loads(request.raw_post_data)

有关django希望在原始POST数据检查中看到的内容,请参见此处:,特别是关于应用程序/x-www-form-urlencoded如何工作的部分。

请求。原始POST数据在django 1.4.3中被弃用
并在1.5中删除

和使用

data = simplejson.loads(request.body)

实际上,您不必将simplejson与代码一起上传。它可以通过以下方式直接在App Engine上访问:from django.utils import simplejson提供相同解决方案的另一个问题还有一个答案:是的,对不起,我已经在使用simplejson了。顺便说一句,这个方法simplejson.loads(request.raw\u post\u数据)非常有效。谢谢真正地感谢Franck,他不知道它已经可用:)导入simplejson并使用data=simplejson.loads(request.body)代替request.raw\u post\u数据
data = simplejson.loads(request.body)