2010-09-18 14 views
21

Jak otrzymać JSON z zapytań POST w CherryPy?Jak otrzymać JSON na żądanie POST w CherryPy?

Byłem w this page i mimo, że robi dobrą robotę wyjaśniając API, jego parametry i co robi; Nie mogę wymyślić, jak z nich korzystać, aby przeanalizować przychodzące JSON do obiektu.

Oto co mam do tej pory:



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) 

A oto moje wezwanie jQuery aby Poczty


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 
    }; 
} 

Odpowiedz

27

przykład robocza:

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

doc jesteś połączony z opisuje kilka narzędzi CherryPy, które są nowe w wersji 3.2. Narzędzie json_in zasadniczo robi powyższe, z pewnym rygorem i używa nowego interfejsu API przetwarzania treści w wersji 3.2.

Należy pamiętać, że funkcja jQuery w postaci post wydaje się nie być w stanie wysłać JSON (tylko je odbierać). Argument dataType określa typ danych, których oczekiwanie XmlHTTPRequest na odbierze, a nie typ, który będzie wysyłał, i nie wydaje się, aby dostępny był argument umożliwiający określenie typu, który chcesz wysłać. Zamiast tego można użyć opcji ajax().

35

Python

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 

JavaScript

//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 za piszesz, to IMHO najczystszym sposobem aby to zrobić. –

+0

'cherrypy.request' nie ma atrybutu' json' – IAbstract

+2

@Abstract sprawdź, czy masz dekorator '' 'cherrypy.tools.json_in()' ''. –

1

znalazłem sposób @cherrypy.tools.json_in() nie bardzo czyste, ponieważ zmusza do korzystania cherrypy.request.json. Zamiast tego następujący dekorator próbuje naśladować parametry GET.

Następujące pomaga to.

UWAGA: Zakłada chcesz powrócić 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 

przykład:

{"foo": "bar"} 

get języku

@cherypy.expose 
@uses_json 
def endpoint(foo): 
     ....