Источник исключения журнала из декоратора flask - PullRequest
1 голос
/ 23 февраля 2020

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

decorators.py

def exception(original_function=None, message='Some error occurred on our end.', app=None):
    def decorator(function):
        @functools.wraps(function)
        def wrapper_function(*args, **kwargs):
            try:
                return function(*args, **kwargs)
            except Exception as e:
                handler(app, e)
                return internal_error(message)

        return wrapper_function

handler Функция захватывает детали исключений и регистрирует или отображает их.

def handler(app, e='Exception'):
    exc_type, exc_obj, exc_tb = sys.exc_info()
    exc_type, filename, line_no = exc_type, exc_tb.tb_frame.f_code.co_filename, exc_tb.tb_lineno

    app.logger.error(f'\n+{"-" * 64}\n'
                     '| Exception details:\n'
                     f'| Message: {e}\n'
                     f'| Type:\t\t{exc_type}\n'
                     f'| File:\t\t{filename}\n'
                     f'| Line No:\t\t{line_no}\n'
                     f'+{"-" * 64}\n')

Затем я использую его в flask маршрутах как:

route.py

@bp.route('/initialize/<string:uuid>/<string:method>', methods=['POST'])
@exception(app=current_app)
def initialize(uuid=None, method=None):
    if not uuid:
        return bad_request('No UUID')

В данный момент обработчик работает, однако он регистрирует, что исключение возникло из decorators.py в строке return function(*args, **kwargs). Как мне зарегистрировать фактический файл и вывести строку, в которой возникло исключение?

Вот вывод журнала.

+----------------------------------------------------------------
| Exception details:
| Message: Required PAYPAL_CLIENT_ID and PAYPAL_CLIENT_SECRET.    
| Type:         <class 'paypalrestsdk.exceptions.MissingConfig'>
| File:         /app/decorators.py
| Line No:              16
+----------------------------------------------------------------
...