Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
登录时需要ajax视图上的decorator返回401而不是302_Ajax_Django - Fatal编程技术网

登录时需要ajax视图上的decorator返回401而不是302

登录时需要ajax视图上的decorator返回401而不是302,ajax,django,Ajax,Django,在编写一些视图来响应ajax请求时,我发现有点奇怪,login_required decorator总是为未经身份验证的用户返回302状态码。因为这些视图是ajax视图,所以这似乎有点不合适。我不希望用户在这种情况下登录,但我希望Django告诉客户端,访问这样的视图需要身份验证(我认为401应该是正确的状态代码) 为了实现这一点,我开始编写自己的decoratorlogin\u required\u ajax,但不知何故,这超出了我的技能范围。这就是我到目前为止的想法: def login_r

在编写一些视图来响应ajax请求时,我发现有点奇怪,login_required decorator总是为未经身份验证的用户返回302状态码。因为这些视图是ajax视图,所以这似乎有点不合适。我不希望用户在这种情况下登录,但我希望Django告诉客户端,访问这样的视图需要身份验证(我认为401应该是正确的状态代码)

为了实现这一点,我开始编写自己的decoratorlogin\u required\u 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?

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

  • 您的
    \u decorator
    函数应该返回
    \u wrapped\u视图
  • if函数为None
    块的缩进有点不正确--
    login\u required\u 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)
    

    一个与您的控制器无关的想法:您还可以引入一个中间件,它检查一个请求是否是ajax请求,如果检测到视图为登录返回一个
    302
    ,则返回一个
    401
    。。。因此,您可以继续使用Django的decorator,处理ajax和普通请求……这听起来真的比“创建自定义decorator并在ajax视图上使用它”简单吗?;)工作起来很有魅力。非常感谢。