В пирамиде, как вернуть 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])