我在终端中运行以下命令来验证我当前安装的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
中答案 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