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))
$.ajax
dataType
параметр необходим только, когда вы возвращаетесь из JSON Python обратно в JQuery; он сообщает jQuery для декодирования ответа для вас. Это не является строго необходимым даже тогда, поскольку достаточно ответа на заголовок Content-Type application/json
.
Вы пробовали без стягивания? – Jai
@Jai: нет, тогда они не отправили бы JSON. Это проблема, которую нужно решить на * принимающей стороне *. –