2011-08-20 172 views
1

我有基于OpenID提供程序的登录系统,我想创建类似@login_required的装饰器。但我有一个问题 - 我需要检查每个对象的许可。我将id传递给了我的视图,所以我想知道是否有任何方法将它传递给装饰器,或者这是不可能的,我需要在我的视图中检查用户权限。有没有办法将变量传递给装饰器?

+1

可能的重复[Understanding Python decorators](http://stackoverflow.com/questions/739654/understanding-python-decorators)。这是一个旧帖子,但它有很多很好的信息。 –

+0

是的,谢谢,我正在寻找Django装饰器,所以错过了这篇文章。它真的帮助我。 – Lertmind

回答

3
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函数。这被称为封闭。

3

取决于当你需要做的东西,你可能需要包装的两个级别的ID,你有什么是你需要做的的方法被调用之前更换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 
+0

也许最有趣的事情是定义的函数“方法”是一个**真正的方法**。自引用的行为与预期相同,暴露了一个活的对象来玩。 –

相关问题