当前位置: 首页 > 面试题库 >

在ajax视图上,login_required装饰器将返回401而不是302

万志专
2023-03-14
问题内容

在编写一些视图以响应Ajax请求时,我发现login_required装饰器对于未通过身份验证的用户始终html" target="_blank">返回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?


问题答案:

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

  1. 您的_decorator函数应该返回_wrapped_view
  2. 您的代码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)


 类似资料:
  • Python 拥有一件非常有趣的特性,那就是函数装饰器。这个特性允许您使用一些 非常简介的语法编辑 Web 应用。因为 Flask 中的每个视图都是一个函数装饰器, 这些装饰器被用来将附加的功能注入到一个或者多个函数中。 route() 装饰器您可能已经使用过了。但是在一些情况下您需要实现自己的装饰器。例如, 您有一个仅供登陆后的用户访问的视图,如果未登录的用户试图访问,则把用户 转接到登陆界面。

  • 我已经实现了JWT认证和授权。一切都很好,除了未经授权的场景 未经授权的情况:在不提供授权令牌的情况下对路由进行http调用。 结果:禁止403例,未批准403例 以下是我的完整课程: 备注: 我在UsernamePasswordAuthenticationFilter中遇到了同样的问题,我通过重写默认的AuthenticationFailureHandler解决了这个问题:

  • 我有一个简单的docker化Spring靴应用程序。当我在本地运行应用程序(没有docker)一切运行正常。控件返回jsp视图。 但当我使用容器运行应用程序时,它会返回一个包含html代码的文件。我可以尝试强制控制器返回html响应而不是八位字节流,但这不是一个聪明的解决方案。 我意识到问题在jasper、tomcat和docker通信之间,但我找不到它,于是我尝试了一系列解决方案。 任何帮助都很

  • 问题内容: django中是否有一个类似于@login_required的装饰器,它也可以测试用户是否是超级用户? 谢谢 问题答案: 使用装饰器:

  • 我试图通过spring boot学习Spring Security的基础知识,我创建了一个项目,其中还包括postgresql设置。Postgresql部分按预期工作。 问题是,在我通过正确的凭据访问安全endpoint后,我只是试图使用正确的用户名和错误的密码进行访问,并期待401错误,但返回200。并返回endpoint的内容。 如果我使用和进行基本身份验证请求,则响应为401 UnAutho

  • 我刚开始在firebase工作。我设法上传了文本和图像,但是,我无法检索要显示在回收器视图中的图像,只能检索文本。我用的是毕加索依赖。我已经包括了我的主要活动。java类,该类负责显示从问题“我的适配器”中的firebase检索的回收器视图项。java类和模型类。我相信,在我将图像URI上载到firebase存储时,我可能犯了没有存储图像URI的错误,因此适配器无法检索图像位置。我想这可能是因为我