Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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 @不重定向已注销用户的情况下登录\u required()_Python_Django_Python Decorators - Fatal编程技术网

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)