ajax不验证required,关于django:在ajax视图上,login_required装饰器返回401而不是302

在编写一些视图以响应Ajax请求时,我发现login_required装饰器对于未通过身份验证的用户始终返回302状态码有些奇怪。由于这些视图是ajax视图,因此这似乎有些不合适。我不希望用户在这种情况下登录,但我希望Django告诉客户端访问此视图需要身份验证(我认为401应该是正确的状态代码)。

为了实现这一点,我开始编写自己的装饰器login_required_ajax,但这在某种程度上超出了我的技能范围。到目前为止,这是我想出的:

def login_required_ajax(function=None,redirect_field_name=None):

"""

Just make sure the user is authenticated to access a certain ajax view

Otherwise return a HttpResponse 401 - authentication required

instead of the 302 redirect of the original Django decorator

"""

def _decorator(view_func):

def _wrapped_view(request, *args, **kwargs):

if request.user.is_authenticated():

return view_func(request, *args, **kwargs)

else:

return HttpResponse(status=401)

if function is None:

return _decorator

else:

return _decorator(function)

在视图上使用此装饰器时,一旦尝试访问网站上的任何页面,我都会收到ViewDoesNotExist异常。

我首先认为问题可能是用户未通过身份验证时直接返回HttpResponse,因为响应对象不是可调用的。但是只要我不尝试访问相关视图,装饰器就应该可以工作,不是吗?如果这确实是症结所在,我该如何编写一个装饰器来返回状态代码为401的HttpResponse?

与导演无关的想法:您还可以引入中间件,该中间件检查请求是否为ajax请求,如果检测到视图返回登录的302,则返回401。 继续使用Django的装饰器并处理不同的ajax和普通请求...

与"创建自定义装饰器并在ajax视图中使用它"相比,这听起来真的更简单吗? ;)

这是一个很好的尝试。 这是我发现的几个问题:

您的_decorator函数应返回_wrapped_view。

if function is None块的缩进有点小了-login_required_ajax函数需要返回修饰后的函数。

这是进行了这些更改的装饰器:

def login_required_ajax(function=None,redirect_field_name=None):

"""

Just make sure the user is authenticated to access a certain ajax view

Otherwise return a HttpResponse 401 - authentication required

instead of the 302 redirect of the original Django decorator

"""

def _decorator(view_func):

def _wrapped_view(request, *args, **kwargs):

if request.user.is_authenticated():

return view_func(request, *args, **kwargs)

else:

return HttpResponse(status=401)

return _wrapped_view

if function is None:

return _decorator

else:

return _decorator(function)

奇迹般有效。 谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值