2010-09-16 57 views
3

当我发送POST消息到GAE使用POST服务器解析的的QueryDict不会被解析就像一个JSON一个JSON参数...问题的Django/GAE

我发现了一个类似的在这个问题上的问题:iphone Json POST request to Django server creates QueryDict within QueryDict

也许是GAE配置的问题。我已经使用最新版GAE的Python 2.6.6。首先,如果我得到这个职位,以数控刀具,开机自检消息是完美的:

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 

和IDEA¿?

在服务器中的查询字典是<QueryDict: {u'{"id":"xxx","jsonrpc":"2.0","method":"XXX","params":{...}}': [u'']}>

正如你可以检查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'] 

但是也许你能帮助我找到一个又一个......

谢谢,

回答

7

在使用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数据的检查,看的参考:http://en.wikipedia.org/wiki/POST_(HTTP),特别是关于如何位应用程序/ x-WWW-形式urlencoded作品。

+2

其实你不必须用您的代码上传simplejson 。它可以通过App Engine直接访问:从django.utils import simplejson – Franck 2010-09-16 14:07:35

+0

对于提供相同解决方案的另一个问题也有一个答案:http://stackoverflow.com/questions/1208067/wheres-my-json-data-in- my-incoming-django-request/3244765#3244765 – Franck 2010-09-16 14:10:29

+0

对不起,我已经在使用simplejson了。顺便说一句,这个方法simplejson.loads(request.raw_post_data)完美工作。谢谢!!! – 2010-09-16 14:11:20

1
import simplejson 

取出并使用

data = simplejson.loads(request.body) 

代替request.raw_post_data