Python @不重定向已注销用户的情况下登录\u required()
未登录的用户将被Python @不重定向已注销用户的情况下登录\u required(),python,django,python-decorators,Python,Django,Python Decorators,未登录的用户将被@login\u required()装饰程序重定向到设置.py中指定的登录\u URL。到现在为止,一直都还不错。但我不想那样。我不想重定向它们,而是想向未登录的用户显示一条错误消息 我认为这可能会起作用,但我得到了一个类型错误:ios\u login\u required()正好接受一个参数(给定0),我不理解。这是一个装饰师,需要什么论据 def ios_login_required(f): def wrapper(request, *args, **kwargs)
@login\u required()
装饰程序重定向到设置.py
中指定的登录\u URL
。到现在为止,一直都还不错。但我不想那样。我不想重定向它们,而是想向未登录的用户显示一条错误消息
我认为这可能会起作用,但我得到了一个类型错误:ios\u login\u required()正好接受一个参数(给定0)
,我不理解。这是一个装饰师,需要什么论据
def ios_login_required(f):
def wrapper(request, *args, **kwargs):
if not request.user.is_authenticated:
return HttpResponse("You need to be logged in.")
else:
return f(request, *args, **kwargs)
return wrapper
带有装饰器的视图可能如下所示:
@ios_login_required()
def amiloggedinornot(request):
return HttpResponse("Congrats, you are logged in!")
知道我哪里出错了吗
@ios_login_required()
def amiloggedinornot(request):
...
# equals to
def amiloggedinornot(request):
...
amiloggedinornot = ios_login_required()(amiloggedinornot)
您可以看到,ios\u login\u required
在不使用任何参数的情况下被调用,而它需要一个参数f
因此,在@ios\u login\u required
之后尝试类似的操作(无()
):
您可以阅读更多关于Python decorator和
此外,
user.is\u authenticated
是一个方法,您需要调用它来获得布尔结果<代码>非用户。是否经过身份验证将始终为False
当我省略括号时,返回值始终为“恭喜您登录!”
@Jo。此时,类型错误
已修复。user.is\u authenticated
是一个方法,应该调用它:如果不是request.user.is\u authenticated():
。对了,我忘了在is\u authenticated
之后添加括号。除了省略@ios\u login\u required
后的括号外,它还能正常工作,谢谢!但我很好奇,为什么我给这个装潢师打电话时要忽略它们?我的其他装饰师都有。你知道吗?@Jo。最好阅读Python decorator和。这个概念很简单:@foo
上面的一个函数bar
将用foo(bar)
的结果替换函数,后者通常是另一个与函数bar
具有类似签名的函数<代码>@foo()在函数bar
上方,它将用foo()(bar)
的结果替换函数。你可以看到他们的不同。我不知道你们其他的装饰师长得怎么样,但规则是一样的。
@ios_login_required
def amiloggedinornot(request):
...
# which equals to
def amiloggedinornot(request):
...
amiloggedinornot = ios_login_required(amiloggedinornot)