Как получить данные 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 (тело не найдено)».

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

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


person Larry Lustig    schedule 28.09.2011    source источник


Ответы (2)


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

Либо:

  1. Вызовите JSON.stringify для вашего объекта данных перед его отправкой (что должно заставить ваш вызов simplejson.loads работать).
  2. Удалите свой атрибут processData и позвольте jQuery отправить запрос как обычный запрос в кодировке URL (и вы можете получить доступ к своим переменным через request.params["word"]).
person Sean Vieira    schedule 28.09.2011
comment
На данный момент меня не интересуют данные, представленные в виде JSON или строки запроса. contentType есть, потому что я обнаружил, что без него я получил статус отказа 500. Я не могу вспомнить, когда и почему я добавил инструкцию processData, но сегодня вечером я проверю без этого. Просто знать (вместо того, чтобы просто ожидать), что данные должны появиться в .params, уже помогает. - person Larry Lustig; 28.09.2011
comment
Когда я удаляю аргумент processData, я по-прежнему не получаю никаких параметров в своем обработчике сервера. Если я также удалю аргумент contentType, мой обработчик больше не будет выполняться, я получу статус 400. Однако, если я вызову JSON.stringify для своих данных, это сработает! - person Larry Lustig; 29.09.2011

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

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

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

person ctcherry    schedule 28.09.2011
comment
Ничего в cherrypy.request.params (len() равно 0). Я был бы рад найти свое значение где-нибудь в запросе — я просмотрел тело, заголовки и т. д. - person Larry Lustig; 28.09.2011
comment
Можете ли вы пронюхать запрос с помощью браузера, чтобы увидеть, как он отправляется? Инспектор в Chrome или Firebug в Firefox. Также содержит ли rawbody какой-либо контент? - person ctcherry; 28.09.2011
comment
Я использую консоль javascript в Chrome для проверки кодов ответов, но не знаю, как просмотреть исходящий запрос. - person Larry Lustig; 28.09.2011
comment
Вкладка «Сеть» инспектора (откройте вкладку, затем обновите страницу, чтобы убедиться, что она активна). Затем выполните действие, которое запускает запрос AJAX, вы увидите, что оно отображается в виде новой строки на вкладке «Сеть», затем щелкните ее, и вы справа будет много информации: запрос, ответ и т.д. - person ctcherry; 28.09.2011
comment
Спасибо, я понятия не имел, что могу шпионить за вещами на таком уровне. В частности, мой вызов ajax возвращал трассировку стека для ошибок Python в тех случаях, когда я просто видел статус 500 на консоли CherryPy. Используя это и вызов JSON.stringify, упомянутый Шоном, вместе с кодом из более раннего ответа от fumanchu, теперь у меня работает передача JSON. - person Larry Lustig; 29.09.2011