Какова лучшая практика для обработки ошибок flask? - PullRequest
0 голосов
/ 20 февраля 2020

Для возврата ответа 400/500 клиентам в веб-приложении flask я видел следующие соглашения:

Прервать

import flask
def index(arg):
    return flask.abort("Invalid request", 400)

Кортеж

def index(arg):
    return ("Invalid request", 400)

Ответ

import flask
def index(arg):
    return flask.Response("Invalid request", 400)

В чем разница и когда один из них предпочтительнее?

Смежный вопрос

Исходя из Java/Spring, я привык определять Пользовательское исключение с кодом состояния, связанным с ним, и затем каждый раз, когда приложение выдает это исключение, ответ с этим кодом состояния автоматически возвращается пользователю (вместо того, чтобы явно его перехватить и вернуть ответ, как показано выше). Это возможно в flask? Это моя маленькая завернутая попытка

from flask import Response

class FooException(Exception):
    """ Binds optional status code and encapsulates returing Response when error is caught """
    def __init__(self, *args, **kwargs):
        code = kwargs.pop('code', 400)
        Exception.__init__(self)
        self.code = code

    def as_http_error(self):
        return Response(str(self), self.code)

Затем использовать

try:
    something()
catch FooException as ex:
    return ex.as_http_error()

1 Ответ

1 голос
/ 20 февраля 2020

Рекомендуется создавать собственные классы исключений, а затем регистрироваться в приложении Flask через декоратор обработчика ошибок. Вы можете вызвать пользовательское исключение из бизнес-логики c, а затем разрешить обработчику ошибок Flask обрабатывать любое из определенных пользователем исключений. (Аналогичным образом это делается и в Spring.)

Вы можете использовать декоратор, как показано ниже, и зарегистрировать свое исключение.

@app.errorhandler(FooException)
def handle_foo_exception(error):
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response

Подробнее об этом можно прочитать здесь Реализация Исключения API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...