Requst'对象没有'json'属性

3 投票
4 回答
12381 浏览
提问于 2025-04-18 05:50

我在终端里运行了以下命令来检查我当前安装的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:

我在Eclipse里用PyDev做这个。如果我按住Ctrl键点击cherrypy.request中的request,它会打开cherrypy__init__.py这个文件,这很正常。但是,如果我按住Ctrl键点击json,它就找不到这个文件。

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

4 个回答

0

确实,你发送的数据是以JSON格式,而不是通常的表单编码格式,所以你并没有设置json这个键。你可以这样做:

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

或者如果你真的想以JSON编码的方式发送数据,你需要访问原始的请求主体。可以参考这个链接:如何在CherryPy中接收POST请求的JSON数据?

1

如果你没有使用到 json_in() 这个函数,你可能会遇到这个问题。

@cherrypy.tools.json_in()
def POST(self, ...):
     ...
2

在OPTION方法中没有JSON这个参数,只有在POST方法中才有。使用CORS的时候,当你发送POST请求时,会有两个请求:一个是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
1

你是在发送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())

希望这能帮到你!

撰写回答