поднять неверный запрос json

Я изо всех сил пытаюсь поднять неверный запрос в API, который возвращает json. Идея такова:

if True:
    raise BadRequest({'error_message' : 'stuff',
                      'suggestions'   : 'other stuff'})

ясно, что это не сработает, но я не уверен, противоречит ли логике возврат json с неверным запросом.


person Rob    schedule 22.01.2016    source источник
comment
аналогичный вопрос: stackoverflow.com/questions/13773862/   -  person mathieu    schedule 24.10.2018


Ответы (2)


Вы путаете термины «возврат» и «рейз». Они имеют очень точное значение.

Вы можете только «поднять» подкласс Exception. Путь выполнения программы после оператора «raise» следует правилам обработки исключений Python. Функция, вызывающая исключение, не возвращается. Вы можете создать подкласс Exception, где аргументом является словарь, как в вашем примере. Это было бы похоже на объект JSON, но он все равно должен быть подклассом Exception, если вы хотите использовать его в операторе повышения.

Вы можете «вернуть» любой объект из функции. Путь выполнения программы следует правилам вызовов и возвратов функций Python. Возвращенный объект может быть объектом JSON, а содержимое объекта может быть сообщением об ошибке. Но если ваша функция возвращает этот тип объекта, ваш клиентский код должен проверить этот объект, чтобы определить, произошла ли ошибка.

person Paul Cornelius    schedule 22.01.2016

Я полагаю, вы используете Flask. Ответ — да, вы можете указать Flask правильно форматировать HTTP-ответы в случае ошибок. Вы должны зарегистрировать определенный обработчик, и вы можете управлять нужным вам форматированием.

Вот пример, вдохновленный сообщением Coderwall

from flask import jsonify
from werkzeug.exceptions import default_exceptions
from werkzeug.exceptions import HTTPException

class JSONExceptionHandler(object):
    def __init__(self, app=None):
        if app:
            self.init_app(app)

    def std_handler(self, error):
        response = jsonify(message=str(error))
        response.status_code = error.code if isinstance(error, HTTPException) else 500
        return response

    def init_app(self, app):
        self.app = app
        self.register(HTTPException)
        for code, v in default_exceptions.iteritems():
            self.register(code)

    def register(self, exception_or_code, handler=None):
        self.app.errorhandler(exception_or_code)(handler or self.std_handler)

И затем, когда вы создаете свое приложение Flask:

app = Flask('your_app')
JSONExceptionHandler(app)
person mathieu    schedule 24.10.2018