2015-01-11 2 views
0

Я хотел бы отправить некоторые данные из jQuery на бэкэнд Tornado Python.JQuery POST JSON данные для бэкэнда Python

Вот простой пример:

$.ajax({ 
    url: '/submit_net', 
    dataType: 'json', 
    data: JSON.stringify({"test_1":"1","test_2":"2"}), 
    type: 'POST', 
    success: function(response) { 
     console.log(response); 
    }, 
    error: function(error) { 
     console.log(error); 
    } 

}); 

Вот код Python:

class submit_net(tornado.web.RequestHandler): 
    def post(self): 
     data_json = self.request.arguments 
     print data_json 

Когда я нажимаю представить кнопку затем бэкенд Python извлекает следующий словарь

{'{"test_1":"1","test_2":"2"}': ['']} 

, но я хотел бы получить точно то же самое d Հ as jQuery отправляет:

{"test_1":"1","test_2":"2"} 

Не могли бы вы помочь мне в том, что я делаю неправильно?

+1

Вы пробовали без стягивания? – Jai

+0

@Jai: нет, тогда они не отправили бы JSON. Это проблема, которую нужно решить на * принимающей стороне *. –

ответ

3

request.arguments следует использовать только для Форма кодированных данных. Используйте request.body, чтобы доступ к необработанным данным JSON и декодирования с json module:

import json 

data_json = self.request.body 
data = json.loads(data_json) 

request.body содержит байт, который хорошо в Python 2, но если вы используете Python 3 вам нужно декодировать тех Unicode первым. Получить запрос символьный набор с cgi.parse_header():

from cgi import parse_header 

content_type = self.request.headers.get('content-type', '') 
content_type, params = parse_header(content_type) 
charset = params.get('charset', 'UTF8') 
data = json.loads(data_json.decode(charset)) 

Значение по умолчанию в UTF-8 набор символов, который по умолчанию является действительно только для JSON запросов; другие типы содержимого запроса должны обрабатываться по-разному.

Вы можете сделать это ясно, что вы отправляете тело JSON, установив тип контента:

$.ajax({ 
    url: '/submit_net', 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify({"test_1":"1","test_2":"2"}), 
    type: 'POST', 
    success: function(response) { 
     console.log(response); 
    }, 
    error: function(error) { 
     console.log(error); 
    } 
}); 

и убедитесь в обработчике Tornado POST, что этот тип контента используется, прежде чем пытаться декодировать POST в формате JSON:

content_type = self.request.headers.get('content-type', '') 
content_type, params = parse_header(content_type) 
if content_type.lower() != 'application/json': 
    # return a 406 error; not the right content type 
    # ... 

charset = params.get('charset', 'UTF8') 
data = json.loads(data_json.decode(charset)) 

$.ajaxdataType параметр необходим только, когда вы возвращаетесь из JSON Python обратно в JQuery; он сообщает jQuery для декодирования ответа для вас. Это не является строго необходимым даже тогда, поскольку достаточно ответа на заголовок Content-Type application/json.

+0

Какой обработчик вы бы использовали для этого в торнадо? –

Смежные вопросы