В пирамиде, как вернуть 400 ответов с данными json?
У меня есть следующий код jquery:
$.ajax({
type: 'POST',
url: url,
data: data,
dataType: 'json',
statusCode: {
200: function (data, textStatus, jqXHR) {
console.log(data);
},
201: function (data, textStatus, jqXHR) {
log(data);
},
400: function(data, textStatus, jqXHR) {
log(data);
},
},
});
400 используется, когда проверка в backend (Pyramid) не выполняется. Теперь из Pyramid, как мне вернуть ответ HTTPBadRequest() вместе с данными json, которые содержат ошибки проверки? Я попробовал что-то вроде:
response = HTTPBadRequest(body=str(error_dict)))
response.content_type = 'application/json'
return response
Но когда я проверяю в firebug, он возвращает 400 (Bad Request), который хорош, но он никогда не анализирует json-ответ из data.responseText выше.
Ответы
Ответ 1
Ну, вы должны начать с сериализации error_dict
с помощью библиотеки json.
import json
out = json.dumps(error_dict)
Учитывая, что вы не указали какой-либо контекст настройки вашего представления, я могу только показать вам, как я это сделаю:
@view_config(route_name='some_route', renderer='json')
def myview(request):
if #stuff fails to validate:
error_dict = # the dict
request.response.status = 400
return {'errors': error_dict}
return {
# valid data
}
Если вы хотите создать ответ самостоятельно, выполните следующие действия:
response = HTTPBadRequest()
response.body = json.dumps(error_dict)
response.content_type = 'application/json'
return response
Чтобы отладить проблему, перестаньте основываться на том, работает ли jQuery, и посмотрите сами запросы, чтобы определить, работает ли Pyramid правильно, или если это что-то еще, что происходит.
curl -i <url>
Или просто откройте отладчик в браузере, чтобы посмотреть, что возвращается в ответ.
Ответ 2
Вы можете изменить код состояния ответа следующим образом: request.response.status_code = 400. Следующий экзамен работает для меня
@view_config(route_name='qiwiSearch', request_method='GET', renderer='json')
def qiwiSearchGet(request):
schema = SchemaQiwiSearchParams()
try:
params = schema.deserialize(request.GET)
except colander.Invalid, e:
errors = e.asdict()
request.response.status_code = 400
return dict(code=400, status='error', message=unicode(errors))
log.debug(u'qiwiSearchGet: %s' % params)
return dict(code=200, status='success', message='', data=[1,2,3])