2011-03-30 69 views
13

我的问题是一般问题,但具体而言,我的应用程序是Django的login_required装饰器。检查一个函数是否有装饰器

我很好奇,如果有一种方法来检查,如果视图/函数有一个特定的装饰(在这种情况下login_required装饰)

我出将用户登录后重定向,我想重定向如果它们当前所在的页面具有login_required装饰器,则返回主页面。到目前为止,我的搜索没有结果。

回答

15

建立你自己的login_required装饰,并将其标记为装饰功能 - 可能是标记它的最佳位置将在func_dict

from django.contrib.auth.decorators import login_required as django_l_r 

# Here you're defining your own decorator called `login_required` 
# it uses Django's built in `login_required` decorator 
def login_required(func): 
    decorated_func = django_l_r(func) 
    decorated_func.func_dict['login_is_required'] = True 
    return decorated_func 

@login_required # Your decorator 
def authenticatedd_view(request): 
    pass 

def unauthenticated_view(request): 
    pass 

现在你可以检查,看看是否有一种观点装饰这样的...

# Assume `a_view` is view function 
>>> a_view.func_dict.get('login_is_required',False) 

如果你感到困惑的Python装修看到这个SO提问/回答:How to make a chain of function decorators?

+0

“标记装饰的功能”?为什么不用正确的URL名称标记每个函数以在退出时重定向?这会更直接有用。 – 2011-03-30 17:41:54

+0

@ S.Lott听起来你的意思是将一个URL或一个URL名称附加到视图函数,我相信这将是一个不好的做法,因为它会混合你的网站和视图,它们在Django中明确分开。 – 2011-03-30 17:46:04

+0

@Chris W .:在视图中引用URL名称,以便“reverse()”可以工作。同样,URL模板中的URL名称也是引用的,所以'{%url%}'将起作用。我不确定你的意思是“混合”。你能进一步解释吗? – 2011-03-30 17:49:44

2

看来你的情况如下: 1.你有页面是安全的,并在需要登录的装饰器后面 2.你具有不安全的页面,并且可以以登录状态和匿名状态访问页面。

如果我了解您的要求,您希望用户在用户注销时重定向到主页面(假设这是可以以登录状态和匿名状态访问的欢迎页面)。

为什么不仅限制用户只能从安全页面注销的能力,然后将注销时的redirect_url设置为欢迎屏幕?

+0

+1:这是视图功能的用途。注销视图函数可以使用'if request.user.is_anonymous()'来确定是否注销某人,以及显示哪个页面。 – 2011-03-30 18:40:27

+0

是的,但如果您尝试将其注销并将其重定向回注销的页面,则除非您知道该页面/视图是否使用身份验证进行保护,否则这不起作用。 – 2011-05-25 12:34:27

相关问题