Requst'对象没有'json'属性
我在终端里运行了以下命令来检查我当前安装的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())
希望这能帮到你!