Как получить данные AJAX в CherryPy


Начиная подниматься по кривой обучения ajax, я пытаюсь сделать простой вызов ajax обратно в мое приложение CherryPy и повторить данные, отправленные обратно в браузер.

Мой вызов ajax работает, и я могу вернуть, например, метод запроса обратно в браузер.

Однако я не могу найти данные, отправленные браузером в объекте запроса внутри моего обработчика CherryPy. Вот мой обработчик CherryPy, вырезанный из этого вопроса:
class Contact:

def index(self):

    cl = cherrypy.request.headers['Content-Length']
    rawbody = cherrypy.request.body.read(int(cl))
    body = None
    #body = simplejson.loads(rawbody)
    if body is None:
        return cherrypy.request.method + ' (no body found)'
    else:
        return cherrypy.request.method + ' ' + body


index.exposed = True

И вот мой Javascript:

<script type="text/javascript">
function SendContactEntry() {
$.ajax( {type:        "POST",
     url:         "/contact/",
     data:        { word: "HELLO" },
     processData: false,
     cache:       false,
     contentType: "application/json",
     dataType:    "text",
     success:     function (response){
                alert(response);
              }
    }
);
}
</script>    

Используя этот код, мой браузер получает ответ "POST (No body found)".

Что я хочу сделать, так это узнать в моем обработчике CherryPy, что мне было отправлено значение word "HELLO".

Если я раскомментирую строку body = simplejson.loads(rawbody), я получу HTML-статус 500 back от CherryPy. То же самое происходит, если я пытаюсь украсить свою функцию index() с помощью @cherrypy.tools.json_in().

2 2

2 ответа:

Поскольку вы установили processData в false и передаете объект, вы посылаете по Строковой версии вашего объекта данных - и там ничего не видно.

Либо:

  1. вызовите JSON.stringify объект данных перед его отправкой (что должно заставить ваш вызов simplejson.loads работать).
  2. удалите атрибут processData и позвольте jQuery отправить запрос в виде обычного запроса с кодировкой URL (и вы можете получить доступ к своим переменным через request.params["word"]).

word может быть, уже в cherrypy.request.params. Проверить там?

Http://www.cherrypy.org/wiki/RequestObject#params

Я не думаю, что jQuery преобразует материал, который вы помещаете в data, в объект JSON. http://api.jquery.com/jQuery.ajax/