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

Posted

技术标签:

【中文标题】解析 POST json 消息 Django/GAE 的问题【英文标题】:Problems for parse POST json message Django/GAE 【发布时间】:2011-04-13 05:31:50 【问题描述】:

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

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

可能是 GAE 配置有问题。我有最新版本的 GAE 的 Python 2.6.6。首先,如果我使用 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']

但也许你可以帮我再找一个……

谢谢,

【问题讨论】:

【参考方案1】:

使用 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),特别是有关 application/x-www-form-urlencoded 工作原理的部分。

【讨论】:

其实你不必用你的代码上传simplejson。它可以通过以下方式在 App Engine 上直接访问: from django.utils import simplejson 还有另一个问题的答案提供了相同的解决方案:***.com/questions/1208067/… 是的,对不起,我已经在使用 simplejson。顺便说一句,这个方法 simplejson.loads(request.raw_post_data) 工作得很好。谢谢!!! 真的吗?谢谢弗兰克,不知道它已经可用了:) 导入 simplejson 并使用 data = simplejson.loads(request.body) 代替 request.raw_post_data【参考方案2】:

request.raw_post_data 在 Django 1.4.3 中已弃用 并在 1.5 中删除

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

【讨论】:

【参考方案3】:
import simplejson

并使用

data = simplejson.loads(request.body)

而不是 request.raw_post_data

【讨论】:

以上是关于解析 POST json 消息 Django/GAE 的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中发送和解析 JSON 对象 [关闭]

postjson.消息体大小

如何在coldfusion cfc中接收JSON POST请求

post请求获取json数据 解析json数据

JSON 解析:NSArray POST

解析 json POST 正文