Декораторы с аргументами с помощью Flask - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь создать декоратор с аргументами и использовать его вместе с модулем фляги.

def ios_network_access(arg): #TODO: 
    def real_ios_network_access_decorator(fn):
        def ios_network_access_inner():
            if not request.json:
                print("aborting because not json", fn.__name__)
                abort(400)
            try: 
                print("check args", arg)
                return fn()
            except Exception as e:
                print("the following error occurred in:", fn.__name__)
                print(request.json)
                print(str(e))
                print("---------------------------------")
                abort(503)
   return real_ios_network_access_decorator
@app.route("/someurl")
@ios_network_access("some argument")
def some_function_for_url():
    pass

Однако, потому что фляга использует имена функций в их декораторе (фляга требует уникальности имен функций идекоратор маскирует его), мои конечные точки не создаются.

Здесь очень похожий вопрос, который задает непараметрические декораторы;однако из-за дополнительного функционального слоя этот вопрос отличается.См. AssertionError: При отображении функции View перезаписывается существующая функция конечной точки: main

Есть мысли о том, как передать аргумент в декоратор с помощью qwerks колбы?

1 Ответ

0 голосов
/ 04 января 2019

wraps - это удобный способ обернуть вашу функцию декоратора.Атрибуты функции-оболочки обновляются соответствующими атрибутами из исходной функции.

from functools import wraps

def ios_network_access(arg):
    def real_ios_network_access_decorator(fn):
        @wraps(fn)
        def ios_network_access_inner(*args, **kwds):
            if not request.json:
                print("aborting because not json", fn.__name__)
                abort(400)
            try: 
                print("check args", arg)
                return fn(*args, **kwds)
            except Exception as e:
                print("the following error occurred in:", fn.__name__)
                print(request.json)
                print(str(e))
                print("---------------------------------")
                abort(503)
        return ios_network_access_inner
    return real_ios_network_access_decorator
...