2014-05-08 136 views
1

我已經在終端中運行以下命令來驗證我目前的CherryPy安裝「請求」對象有沒有屬性「JSON」

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中按住control並點擊請求,它會打開文件cherypy__init__.py,這應該是預期的。但是,如果我按住json,則它不知道文件的位置。

我已經試過手動卸載庫 - 然後從https://pypi.python.org/pypi/CherryPy/3.2.4重新下載,並把相應的文件夾在C:\蟒蛇\ LIB \站點包

回答

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()) 

希望這有助於!

+0

你沒有回答他的問題/解決他的錯誤。 – Natecat

+0

問題不在於退貨,而在於處理請求。 返回getattr(兒童,名字) AttributeError:'請求'對象沒有屬性'json' –

+0

我的文件「C:\ Anaconda \ lib \ site-packages \ cherrypy \ __ init__.py」,第224行,在__getattr__中看到。你如何發送json到處理程序?你可以告訴我們你的http請求嗎? –

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?

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 
相關問題