Есть ли способ передать переменные в декоратор? - PullRequest
1 голос
/ 21 августа 2011

У меня есть система входа в систему, основанная на провайдере OpenID, и я хочу создать декоратор, такой как @login_required. Но у меня есть проблема - мне нужно проверить разрешение для каждого объекта. Я передаю идентификатор своим представлениям, поэтому хочу знать, есть ли способ передать его декоратору или это невозможно, и мне нужно проверить разрешение пользователей в моем представлении.

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

В зависимости от того, когда вам нужно выполнить работу с идентификатором, вам может понадобиться два уровня переноса, где вы замените print(permission_id) на то, что вам нужно сделать перед вызовом метода:

def login_required(permission_id):
    def decorator(func):
        def method(self, *args, **kw):
            print(permission_id)
            return func(self, *args, **kw)
        return method
    return decorator

class foo(object):

    @login_required('foo')
    def bar(self):
        print('bar')

foo = foo()
print('instantiated')
foo.bar()

Выходы:

instantiated
foo
bar
3 голосов
/ 21 августа 2011
def outer(var1, var2):
    def inner(func)
        func.foo = var1
        func.bar = var2
        return func
    return inner

@outer(myvar1, myvar2)
def myfunc():
    # whatever
    pass

Хотя вы не можете передавать переменные непосредственно в функцию, которая украшает вашу функцию, вы можете создать другую функцию (outer), которая при вызове возвращает функцию украшения (inner).Вы передаете переменные функции outer, и они доступны для функции inner.Это называется закрытием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...