15

我的问题是一个普遍的问题,但特别是我的应用程序是 Django 的 login_required 装饰器。

我很好奇是否有办法检查视图/函数是否具有特定的装饰器(在本例中为 login_required 装饰器)

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

4

2 回答 2

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 装饰器感到困惑,请参阅这个 SO 问题/答案:如何制作函数装饰器链?

于 2011-03-30T17:36:02.577 回答
2

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

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

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

于 2011-03-30T18:18:58.893 回答