В пирамиде, как вернуть 400 ответ с данными JSON? - PullRequest
13 голосов
/ 20 июля 2011

У меня есть следующий код 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 используется, когда проверка в бэкэнде (пирамиде) не удалась. Теперь из Pyramid, как я могу вернуть HTTPBadRequest () ответ вместе с данными JSON, которые содержат ошибки проверки? Я пробовал что-то вроде:

response = HTTPBadRequest(body=str(error_dict)))
response.content_type = 'application/json'
return response

Но когда я проверяю в firebug, он возвращает 400 (Bad Request), что хорошо, но он никогда не анализирует ответ json из data.responseText выше.

Ответы [ 3 ]

27 голосов
/ 21 июля 2011

Что ж, вам, вероятно, следует начать с сериализации 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>

Или даже просто откройте отладчик в браузере, чтобы посмотреть, что возвращается вответ.

1 голос
/ 17 мая 2018

Я нашел простой способ сделать его более общим, чем принятый ответ, я получил его с этим кодом

Я включаю исключение_ответ на мой взгляд

from pyramid.httpexceptions import exception_response

Я поднимаю исключение 400, где мне нужно

 raise exception_response(400)

В моем сценарии исключений я перехватываю все исключения, чтобы вернуть общий json, и ловушку 400, чтобы возвратить определенный json

from pyramid.view import exception_view_config

from pyramid.httpexceptions import (
    HTTPException,
    HTTPBadRequest
)


@exception_view_config(HTTPException, renderer='json')
def exc_view_exception(message, request):
    return {'error': str(message)}


@exception_view_config(HTTPBadRequest, renderer='json')
# Exception 400 bad request
def exc_view_bad_request(message, request):
    body = {
        "message": str(message),
        "status": 400
    }
    request.response.status = 400
    return body
0 голосов
/ 13 июня 2013

Вы можете изменить код статуса ответа следующим образом: 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])
...