Обработка всех исключений в маршруте Flask - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть простой маршрут в моем приложении Flask:

@app.route('/', methods=['GET'])
def homepage():
    return '{}'.format(1 / 0)

Когда пользователь посещает site.com/, он должен увидеть результат 1/0.Конечно, это невозможно, поэтому Python выдает мне ошибку.

Теперь я бы хотел, чтобы все ошибки на всех моих конечных точках обрабатывались особым образом: я хотел бы, чтобы они возвращали ответ JSON, например:

{
    'status_code': 500,
    'status': 'Internal Server Error'
}

Я написал декоратор, чтобы сделать именно это:

def return_500_if_errors(f):
    def wrapper(*args, **kwargs):
        try:
            return f(*args, **kwargs)
        except:
            response = {
                'status_code': 500,
                'status': 'Internal Server Error'
            }
            return flask.jsonify(response), 500
    return wrapper

Затем я добавил декоратор к конечной точке:

@return_500_if_errors
@app.route('/', methods=['GET'])
def homepage():
    return '{}'.format.(1 / 0)

Однако декоратор кажетсяне иметь никакого эффекта.

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Как отметили @YiFei и @Joost, проблема была в порядке декораторов.

Это действительно работает:

def return_500_if_errors(f):
    def wrapper(*args, **kwargs):
        try:
            return f(*args, **kwargs)
        except:
            response = {
                'status_code': 500,
                'status': 'Internal Server Error'
            }
            return flask.jsonify(response), 500
    return wrapper

@app.route('/', methods=['GET'])
@return_500_if_errors
def homepage():
    return '{}'.format.(1 / 0)

@ Ответ Джуста похож, но как-то отличается, так кактам сама ошибка должна быть захвачена и возвращена - а не стандартизированный JSON.

0 голосов
/ 11 декабря 2018

Я настоятельно рекомендую использовать обработчик ошибок Flask уже существующий декоратор.

По сути, должен выглядеть примерно так:

# flask will check if raised exception is of type 'SomeException' (or lower)
# if so, will just execute this method
@app.errorhandler(SomeException) 
def handle_error(error):
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response

# An exception will be raised, hopefully to be caught by 'handle_error'    
@app.route('/', methods=['GET'])
def homepage():
    return '{}'.format.(1 / 0)

Просто убедитесь, что исключение будетпойман будет иметь «код_состояния» или поставить «500», если не ...

0 голосов
/ 10 декабря 2018

Это то, что вам нужно:

from flask import Flask, jsonify
from functools import wraps

app = Flask(__name__)

def catch_custom_exception(func):
    @wraps(func)
    def decorated_function(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            return str(e), 500
    return decorated_function

@app.route('/', methods=['GET'])
@catch_custom_exception
def homepage():
    return '{}'.format(1 / 0)

@app.route('/2', methods=['GET'])
def homepage2():
    return '{}'.format(1 / 0)
...