Настой на заказ декораторов - PullRequest
0 голосов
/ 01 октября 2019

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

Я использую Flask-Login для управления пользователями. Я хочу сделать собственный декоратор, который позволит мне проверять роли пользователей. Я посмотрел на Реализация Flask-Login с несколькими классами пользователей , я не могу заставить его работать. Я также посмотрел на Декораторы с параметрами? и множество других ссылок, и независимо от того, что я делаю, я не могу соответствовать поведению, которое я нахожу в учебниках и ответах переполнения стека.

Итак, вот одна попытка:

def check_role(f):
@wraps(f)
def decorated_view(*args, **kwargs):
    print(f)
    return f(*args, **kwargs)
return decorated_view

Это работает и печатает название функции, которую я украсил, но она не принимает параметр "роли", для которого я проверяю. Если добавить это:

def check_role(f, a="test"):
    @wraps(f)
    def decorated_view(*args, **kwargs):
        print(f)
        return f(*args, **kwargs)
    return decorated_view

, а затем использовать его с:

@bp.route('/topicManagement', methods=('GET', 'POST'))
@login_required
@check_role(a="foo")

Я получаю " TypeError: check_role () отсутствует 1 обязательный позиционный аргумент: 'f' ». Я пробовал каждую комбинацию, которую могу придумать, с помощью позиционных, необязательных аргументов, и я не могу обойти это. Функция не требует, чтобы я передавал «f» вручную в коде до тех пор, пока я не добавлю параметр таким же образом, как говорится в каждом учебном пособии, а затем прервет работу, потому что хочет получить функциональный параметр, но при попытке предоставить что-либо произойдет ошибкакак этот теперь внезапно обязательный параметр.

Итак, из Декораторов с параметрами? , я попытался сделать:

def check_role(a):
def bar(function):
    def foo(*args, **kwargs):
        print(a)
        return function(*args, **kwargs)
    return foo
return bar

Неважно, что я здесь делаю,независимо от имен или количества функций представления, которые я украсил, я всегда получаю одно и то же:

Невозможно создать URL для конечной точки ''. Вы имели в виду «вместо»?

Спасибо, переполнение стека, ты моя единственная надежда.

...