Python 检查函数是否具有装饰器
我的问题是一般性的,但具体来说,我的应用程序是Django所需的login_装饰程序 我很好奇是否有办法检查一个视图/函数是否有特定的装饰器(在本例中,login\u需要装饰器)Python 检查函数是否具有装饰器,python,django,decorator,login-required,Python,Django,Decorator,Login Required,我的问题是一般性的,但具体来说,我的应用程序是Django所需的login_装饰程序 我很好奇是否有办法检查一个视图/函数是否有特定的装饰器(在本例中,login\u需要装饰器) 我在用户注销后重定向,如果他们当前所在的页面具有登录所需的装饰程序,我希望重定向到主页。到目前为止,我的搜索没有结果。构建您自己的登录\u所需的装饰器,并将其标记为已装饰的函数——最好的标记位置可能是在功能目录中 from django.contrib.auth.decorators import login_requ
我在用户注销后重定向,如果他们当前所在的页面具有登录所需的装饰程序,我希望重定向到主页。到目前为止,我的搜索没有结果。构建您自己的
登录\u所需的
装饰器,并将其标记为已装饰的函数——最好的标记位置可能是在功能目录中
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 decorators感到困惑,请查看以下问题/答案:您的情况如下:
1.您的页面是安全的,并且在需要登录的装饰程序后面
2.您的页面不安全,可以在登录状态和匿名状态下访问
如果我理解您的要求,您希望在用户注销时将用户重定向到主页(假设这是一个欢迎页面,可以在登录和匿名状态下访问)
为什么不限制用户只能从安全页面注销,然后在注销时将重定向url设置为欢迎屏幕?“将功能标记为装饰”?为什么不用正确的URL名称标记每个函数,以便在注销时重定向到?这会更直接有用。@S.Lott听起来您的意思是在视图函数中附加URL或URL名称,我认为这是一种不好的做法,因为这会混合您的URL和视图,它们在Django中明确分开。@Chris W.:URL名称在视图中引用,因此reverse()
将起作用。同样,URL名称也是模板中的引用,因此{%URL%}
将起作用。我不知道你说的“混合”是什么意思。你能进一步解释一下吗?@S.Lott现在你把我弄糊涂了,reverse()
和{%url%}
的要点是将视图函数(或视图函数的字符串描述符)转换为url。这使得HTML模板和视图函数本身都不需要了解URL的任何信息。@Chris W.:URL可以有名称。这可以简化从许多视图函数中查找标准URL的过程。为注销提供一个标准的URL名称通常非常方便。+1:这就是视图功能的用途。注销视图函数可以使用if request.user.is_anonymous()
来确定是否注销某人,以及显示哪个页面。是的,但是如果您试图注销他们并将他们重定向回他们注销的页面,除非您知道该页面/视图是否受到身份验证的保护,否则这是不起作用的。