检查一个函数是否有装饰器

17 投票
2 回答
8968 浏览
提问于 2025-04-16 14:45

我有一个比较普遍的问题,不过具体来说,我是在问Django中的login_required装饰器。

我想知道有没有办法检查一个视图或函数是否有特定的装饰器(在这个例子中就是login_required装饰器)。

我在用户注销后进行重定向,如果用户当前所在的页面有login_required装饰器,我想把他们重定向到主页。到目前为止,我的搜索没有找到相关的结果。

2 个回答

2

看起来你的情况是这样的:

1. 你有一些需要登录才能访问的页面。

2. 你还有一些不需要登录就能访问的页面,这些页面在用户登录和未登录时都可以访问。

如果我理解你的需求没错的话,你希望用户在登出后能被重定向到主页面(假设这是一个欢迎页面,登录和未登录的用户都能访问)。

那么,为什么不限制用户只能在安全页面上登出呢?然后在登出时把他们重定向到欢迎页面呢?

17

自己动手创建一个 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 的装饰器感到困惑,可以看看这个 StackOverflow 的问题和回答:如何制作一系列的函数装饰器?

撰写回答