我的问题是一般问题,但具体而言,我的应用程序是Django的login_required装饰器。检查一个函数是否有装饰器
我很好奇,如果有一种方法来检查,如果视图/函数有一个特定的装饰(在这种情况下login_required装饰)
我出将用户登录后重定向,我想重定向如果它们当前所在的页面具有login_required装饰器,则返回主页面。到目前为止,我的搜索没有结果。
我的问题是一般问题,但具体而言,我的应用程序是Django的login_required装饰器。检查一个函数是否有装饰器
我很好奇,如果有一种方法来检查,如果视图/函数有一个特定的装饰(在这种情况下login_required装饰)
我出将用户登录后重定向,我想重定向如果它们当前所在的页面具有login_required装饰器,则返回主页面。到目前为止,我的搜索没有结果。
建立你自己的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提问/回答:How to make a chain of function decorators?
看来你的情况如下: 1.你有页面是安全的,并在需要登录的装饰器后面 2.你具有不安全的页面,并且可以以登录状态和匿名状态访问页面。
如果我了解您的要求,您希望用户在用户注销时重定向到主页面(假设这是可以以登录状态和匿名状态访问的欢迎页面)。
为什么不仅限制用户只能从安全页面注销的能力,然后将注销时的redirect_url设置为欢迎屏幕?
+1:这是视图功能的用途。注销视图函数可以使用'if request.user.is_anonymous()'来确定是否注销某人,以及显示哪个页面。 – 2011-03-30 18:40:27
是的,但如果您尝试将其注销并将其重定向回注销的页面,则除非您知道该页面/视图是否使用身份验证进行保护,否则这不起作用。 – 2011-05-25 12:34:27
“标记装饰的功能”?为什么不用正确的URL名称标记每个函数以在退出时重定向?这会更直接有用。 – 2011-03-30 17:41:54
@ S.Lott听起来你的意思是将一个URL或一个URL名称附加到视图函数,我相信这将是一个不好的做法,因为它会混合你的网站和视图,它们在Django中明确分开。 – 2011-03-30 17:46:04
@Chris W .:在视图中引用URL名称,以便“reverse()”可以工作。同样,URL模板中的URL名称也是引用的,所以'{%url%}'将起作用。我不确定你的意思是“混合”。你能进一步解释吗? – 2011-03-30 17:49:44