Django/GAE解析POST JSON消息的问题

3 投票
3 回答
6395 浏览
提问于 2025-04-16 04:14

当我用POST方式发送一个包含json参数的消息到GAE时,服务器解析的QueryDict并没有像json那样被解析...

我在这个问题中发现了类似的情况:iphone的Json POST请求发送到Django服务器时,创建了一个嵌套的QueryDict

这可能是GAE配置的问题。我使用的是Python 2.6.6和最新版本的GAE。首先,如果我用nc工具接收POST请求,POST消息是完美的:

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

有什么想法吗?

服务器中的查询字典是 <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']

但也许你可以帮我找到另一个解决方案...

谢谢,

3 个回答

1
import simplejson

并使用

data = simplejson.loads(request.body)

来代替 request.raw_post_data

1

request.raw_post_data 在 Django 1.4.3 版本中已经不再推荐使用,并且在 1.5 版本中被彻底移除了。

https://github.com/django/django/commit/4a6490a4a0d0d7e45b1f549e3f9d97e5e2aeb731

7

在使用json的时候,首先要记住的是,AppEngine是基于python 2.5的。这意味着json还不是python的标准部分。

为了解决这个问题,我在网上找到了simplejson,并把它和我的代码放在一起。内置的json和simplejson的使用方法基本上是一样的(或者说我可能没注意到有什么不同),所以你可以这样导入它:

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),特别是关于application/x-www-form-urlencoded是如何工作的那部分。

撰写回答