2010-09-18 30 views
21

चेरीपी में POST अनुरोधों से JSON कैसे प्राप्त करें?चेरीपी में POST अनुरोध में JSON कैसे प्राप्त करें?

मैं this page पर गया हूं, और हालांकि यह एपीआई, इसके पैरामीटर और यह क्या करता है समझाता है; मुझे यह पता लगाना प्रतीत नहीं होता कि आने वाले JSON को किसी ऑब्जेक्ट में पार्स करने के लिए उनका उपयोग कैसे किया जाए।



import cherrypy 
import json 

from web.models.card import card 
from web.models.session import getSession 
from web.controllers.error import formatEx, handle_error 

class CardRequestHandler(object): 

    @cherrypy.expose 
    def update(self, **jsonText): 
     db = getSession() 
     result = {"operation" : "update", "result" : "success" } 
     try: 
      u = json.loads(jsonText) 
      c = db.query(card).filter(card.id == u.id) 
      c.name = u.name 
      c.content = u.content 
      rzSession.commit() 
     except: 
      result["result"] = { "exception" : formatEx() } 
     return json.dumps(result) 

और, यहां पोस्ट


function Update(el){ 
    el = jq(el); // makes sure that this is a jquery object 

    var pc = el.parent().parent(); 
    pc = ToJSON(pc); 

    //$.ajaxSetup({ scriptCharset : "utf-8" }); 
    $.post("http://localhost/wsgi/raspberry/card/update", pc, 
      function(data){ 
       alert("Hello Update Response: " + data); 
      }, 
      "json"); 
} 

function ToJSON(h){ 
    h = jq(h); 
    return { 
     "id" : h.attr("id"), 
     "name" : h.get(0).innerText, 
     "content" : h.find(".Content").get(0).innerText 
    }; 
} 

उत्तर

27

कार्य उदाहरण बनाने के लिए मेरी jQuery कॉल है::

import cherrypy 
import simplejson 

class Root(object): 

    @cherrypy.expose 
    def update(self): 
     cl = cherrypy.request.headers['Content-Length'] 
     rawbody = cherrypy.request.body.read(int(cl)) 
     body = simplejson.loads(rawbody) 
     # do_something_with(body) 
     return "Updated %r." % (body,) 

    @cherrypy.expose 
    def index(self): 
     return """ 
<html> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
<script type='text/javascript'> 
function Update() { 
    $.ajax({ 
     type: 'POST', 
     url: "update", 
     contentType: "application/json", 
     processData: false, 
     data: $('#updatebox').val(), 
     success: function(data) {alert(data);}, 
     dataType: "text" 
    }); 
} 
</script> 
<body> 
<input type='textbox' id='updatebox' value='{}' size='20' /> 
<input type='submit' value='Update' onClick='Update(); return false' /> 
</body> 
</html> 
""" 

cherrypy.quickstart(Root()) 

डॉक में आप से जुड़ा हुआ

यहाँ मैं अब तक राशि है चेरीपी टूल्स के कुछ वर्णनों का वर्णन करता है जो संस्करण 3.2 में नए हैं। json_in उपकरण मूल रूप से उपरोक्त करता है, कुछ और कठोरता के साथ, और 3.2 में नए बॉडी प्रोसेसिंग एपीआई का उपयोग करता है।

ध्यान देने योग्य एक महत्वपूर्ण बात यह है कि jQuery का post फ़ंक्शन JSON भेजने में सक्षम नहीं लगता है (केवल इसे प्राप्त करें)। dataType तर्क आपके द्वारा XmlHTTPRequest को प्राप्त करने वाले डेटा के प्रकार को निर्दिष्ट करता है, न कि जिस प्रकार को भेजा जाएगा, और आपके द्वारा भेजने के लिए इच्छित प्रकार निर्दिष्ट करने के लिए कोई तर्क उपलब्ध नहीं प्रतीत होता है। ajax() का उपयोग करके आप इसे निर्दिष्ट करने की अनुमति देते हैं।

35

अजगर

import cherrypy 
import simplejson 

class Root: 

    @cherrypy.expose 
    @cherrypy.tools.json_out() 
    @cherrypy.tools.json_in() 
    def my_route(self): 

     result = {"operation": "request", "result": "success"} 

     input_json = cherrypy.request.json 
     value = input_json["my_key"] 

     #All responses are serialized to JSON. This the same as 
     #return simplejson.dumps(result) 
     return result 

जावास्क्रिप्ट

//assuming that you're using jQuery 

var myObject = { "my_key": "my_value" }; 

$.ajax({ 
    type: "POST", 
    url: "my_route", 
    data: JSON.stringify(myObject), 
    contentType: 'application/json', 
    dataType: 'json', 
    error: function() { 
     alert("error"); 
    }, 
    success: function() { 
     alert("success"); 
    } 
}); 
+2

THX अनुवाद आप पोस्ट के लिए, यह IMHO स्पष्ट तरीका है, इसे करने के लिए। –

+0

'cherrypy.request' में कोई विशेषता नहीं है' json' – IAbstract

+2

@IAbstract जांच करें कि आपके पास '' @ @ cherrypy.tools.json_in() '' 'सजावट है। –

1

मैं @cherrypy.tools.json_in() रास्ता बहुत साफ नहीं मिला है, क्योंकि यह आप cherrypy.request.json उपयोग करने के लिए बाध्य करती है। इसके बजाए, निम्नलिखित सजावटी GET पैरामीटर की नकल करने की कोशिश करता है।

निम्नलिखित में सहायता करता है।

नोट: यह मान लेता है कि वापस जाने के लिए JSON हैं:

def uses_json(func): 

    @functools.wraps(func) 
    @cherrypy.tools.accept(media="application/json") 
    def wrapper(*args, **kwargs): 

     cherrypy.serving.response.headers['Content-Type'] = "application/json" 

     kwargs = dict(kwargs) 

     try: 
      body = cherrypy.request.body.read() 
      kwargs.update(json.loads(body)) 
     except TypeError: 
      pass 

     return json.dumps(func(*args, **kwargs)).encode('utf8') 

    return wrapper 

उदाहरण:

{"foo": "bar"} 

मिलता है में

@cherypy.expose 
@uses_json 
def endpoint(foo): 
     .... 
संबंधित मुद्दे