Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查函数是否具有装饰器_Python_Django_Decorator_Login Required - Fatal编程技术网

Python 检查函数是否具有装饰器

Python 检查函数是否具有装饰器,python,django,decorator,login-required,Python,Django,Decorator,Login Required,我的问题是一般性的,但具体来说,我的应用程序是Django所需的login_装饰程序 我很好奇是否有办法检查一个视图/函数是否有特定的装饰器(在本例中,login\u需要装饰器) 我在用户注销后重定向,如果他们当前所在的页面具有登录所需的装饰程序,我希望重定向到主页。到目前为止,我的搜索没有结果。构建您自己的登录\u所需的装饰器,并将其标记为已装饰的函数——最好的标记位置可能是在功能目录中 from django.contrib.auth.decorators import login_requ

我的问题是一般性的,但具体来说,我的应用程序是Django所需的login_装饰程序

我很好奇是否有办法检查一个视图/函数是否有特定的装饰器(在本例中,login\u需要装饰器)


我在用户注销后重定向,如果他们当前所在的页面具有登录所需的装饰程序,我希望重定向到主页。到目前为止,我的搜索没有结果。

构建您自己的
登录\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()
来确定是否注销某人,以及显示哪个页面。是的,但是如果您试图注销他们并将他们重定向回他们注销的页面,除非您知道该页面/视图是否受到身份验证的保护,否则这是不起作用的。