在编写一些视图来响应 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?