首页 文章

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

提问于
浏览
3

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

我在这个问题上发现了类似的问题: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']

但也许你可以帮我找另一个......

谢谢,

3 回答

  • 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如何工作的内容 .

  • 1

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

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

  • 7
    import simplejson
    

    并使用

    data = simplejson.loads(request.body)
    

    而是request.raw_post_data

相关问题