代码之家  ›  专栏  ›  技术社区  ›  Iván Peralta

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

  •  3
  • Iván Peralta  · 技术社区  · 14 年前

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

    可能是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
    

    你有什么想法?

    <QueryDict: {u'{"id":"xxx","jsonrpc":"2.0","method":"XXX","params":{...}}': [u'']}>

    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 回复  |  直到 7 年前
        1
  •  7
  •   kbec    11 年前

    在使用json时,首先需要记住的是AppEngine使用python2.5。这意味着json还不是python的标准部分。

    为了解决这个问题,我在网上找到了simplejson,并把它和我的代码打包在一起。内置json和simplejson的API本质上是相同的(或者我只是没注意到有什么不同),所以就这样导入它:

    import simplejson as json
    

    像往常一样使用它。

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

    data = json.loads(request.raw_post_data)
    

    关于django希望在原始后期数据检查中看到的内容,请参见: http://en.wikipedia.org/wiki/POST_(HTTP)

        3
  •  1
  •   Antaresm    11 年前
    import simplejson
    

    data = simplejson.loads(request.body)
    

    相反request.raw\u post\u数据