检查一个函数是否有装饰器
我有一个比较普遍的问题,不过具体来说,我是在问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 的问题和回答:如何制作一系列的函数装饰器?