'请求'对象没有属性' json'

时间:2014-05-08 14:36:38

标签: python json cherrypy

我在终端中运行以下命令来验证我当前安装的cherryPy

python -c "import cherrypy;print cherrypy.__version__"
3.3.0

但是,以下代码会导致错误:

@cherrypy.expose
@cherrypy.tools.json_in() 
def observe(self, urlParam1=None):
    print cherrypy.request.json
    return ""

运行时,我收到以下错误:

  File "C:\Anaconda\lib\site-packages\cherrypy\__init__.py", line 224, in __getattr__
    return getattr(child, name)

AttributeError: 'Request' object has no attribute 'json'

编辑:

这就是我发送请求的方式:

 var insertJSON = JSON.stringify(insertObj);

$.ajax({
                type : "POST",
                contentType : "application/json",
                url : 'http://10.XX.X.XXX:XXXX/observe',
                data : insertJSON,
                dataType : "json",
                success : function(result) {
                    alert('observation inserted');
                }
            });

编辑2: 我正在使用PyDev在Eclipse中完成所有这些操作。如果我在cherrypy.request中按控制点击请求,则会打开文件cherypy__init__.py,这应该是预期的。但是,如果我按住Ctrl键单击json,它就不知道文件的位置。

我尝试手动卸载库 - 然后从https://pypi.python.org/pypi/CherryPy/3.2.4重新下载并将相应的文件夹放在C:\ Anaconda \ Lib \ site-packages

4 个答案:

答案 0 :(得分:1)

如果您遗漏json_in()

,可能会遇到此问题
@cherrypy.tools.json_in()
def POST(self, ...):
     ...

答案 1 :(得分:0)

您是否发布了json对象?这段代码对我来说很好。

import cherrypy

class HelloWorld(object):
    @cherrypy.expose
    @cherrypy.tools.json_in() 
    def observe(self, urlParam1=None):
        print(cherrypy.request.json)
        return ""

    @cherrypy.expose
    def asdf(self):
        return """<!DOCTYPE HTML>
                  <html>
                  <head>
                  <script>function Sendjson(){
                  // code for IE7+, Firefox, Chrome, Opera, Safari
                  if(window.XMLHttpRequest)
                      xmlhttp=new XMLHttpRequest();
                  else// code for IE5
                      xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');

                  xmlhttp.open("POST","/observe", true);
                  xmlhttp.setRequestHeader('Content-Type', 'application/json');
                  xmlhttp.send(JSON.stringify(({name:"Bob"})));
                  }
                  </script>
                  </head>
                  <body onload="Sendjson();">
                  </body>
                  </html>"""

cherrypy.quickstart(HelloWorld())

希望这有帮助!

答案 2 :(得分:0)

嗯,确实,您将POST数据作为JSON发送,而不是典型的表单编码数据,因此您永远不会设置密钥json。你可以做到

$.ajax({
    type : "POST",
    url : 'http://10.XX.X.XXX:XXXX/observe',
    data : {json: insertJSON},
    //      ^^^^
    success : function(result) {
        alert('observation inserted');
    }
});

或者,如果您确实要发送JSON编码的数据,则必须访问原始请求正文。请参阅How to receive JSON in a POST request in CherryPy?

答案 3 :(得分:0)

JSON 参数在OPTION方法中不存在,仅在POST中。 使用CORS,当您发布POST时,您有2个请求:一个是OPTION,第二个是POST。

在您的方法中添加一个简单的测试:

 @cherrypy.expose
 @cherrypy.tools.json_out()
 @cherrypy.tools.json_in()
 def dosomething(self):
     result = {"operation": "request", "result": "success"}
     if cherrypy.request.method == "POST":
         print(cherrypy.request.json)
     return result
相关问题