Python Flask - нормально ли возвращать ответ в декораторе? - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть пользовательский декоратор в flask API. Я выполняю некоторые проверки и затем вызываю функцию API, а затем получаю ответ от функции API в декораторе, который затем возвращается. Мне интересно, является ли хорошей / плохой практикой возвращать ответ от декоратора.

Я видел декоратор after_request, который также возвращает ответ, поэтому мне интересно, может ли то же самое это можно сделать с помощью специального декоратора.

Пожалуйста, смотрите код ниже:

Декоратор:

def process_in_progress(process_name, auto_release=True):
    def wrapper(func):
        @functools.wraps(func)
        def process_wrapper(*args, **kwargs):
            try:

                process_status = util.get_value_from_app_metadata(PROCESS_IN_PROGRESS)
                if process_status is not None:
                    return Response(response=responses.response_process_in_progress(process_status), status=409)

                logger.info('Setting process_in_progress')
                db.insert_app_metadata(PROCESS_IN_PROGRESS, process_name)

                response = func(*args, **kwargs)

                if auto_release:
                    process_status = util.get_value_from_app_metadata(PROCESS_IN_PROGRESS)
                    if process_status is not None and process_status == process_name:
                        logger.info('Freeing up process_in_progress : ' + process_name)
                        db.delete_from_app_metadata(PROCESS_IN_PROGRESS)

                return response

            except Exception as e:
                logger.exception(e)
                return Response(response=GENERIC_RESPONSES['internal_server_error'], status=500)

        return process_wrapper
    return wrapper

API-функция:

@api.route("/api/v1/...", methods=['POST'])
@process_in_progress(process_name=PROCESS_KEY)
def my_api_function():
    try:

        perfor_some_action()

        return Response(response=responses.API_RESPONSES['success'], status=200)
    except Exception as e:
        logger.exception(e)
        return Response(response=responses.API_RESPONSES['exception'], status=500)

Пожалуйста, дайте мне знать, если есть какие-то путаницы. Спасибо

...