检查函数是否有装饰器

时间:2011-03-30 17:09:34

标签: python django decorator login-required

我的问题是一般的,但具体来说我的应用程序是Django的login_required装饰器。

我很好奇是否有办法检查视图/函数是否有特定的装饰器(在这种情况下是login_required装饰器)

我在将用户注销后重定向,如果他们当前所在的页面具有login_required装饰器,我想重定向到主页面。到目前为止,我的搜索没有取得任何结果。

2 个答案:

答案 0 :(得分:16)

构建自己的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装饰者感到困惑,请参阅此问题/答案:How to make a chain of function decorators?

答案 1 :(得分:2)

您的情况似乎如下: 1.您的页面是安全的,并且位于需要登录的装饰器后面 2.您的页面不安全,可以在登录状态和匿名状态下访问。

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

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

相关问题