【问题标题】:How to redirect url from middleware in Django?如何从 Django 中的中间件重定向 url?
【发布时间】:2019-02-05 05:39:37
【问题描述】:

如何从中间件重定向 url?

无限循环问题。

如果注册尚未完成,我打算将用户重定向到客户端注册 url。

def check_user_active(get_response):
    def middleware(request):
        response = get_response(request)

        try:
            print(Cliente.objects.get(usuario_id=request.user.id))
        except Cliente.DoesNotExist:
            return redirect('confirm')


        return response
    return middleware

【问题讨论】:

    标签: python django python-3.x django-2.1


    【解决方案1】:

    对服务器的每个请求都通过中间件。因此,当您要去confirm 页面时,请求会再次通过中间件。所以最好在这里设置一些条件,以便它忽略confirm url。你可以这样尝试:

    def check_user_active(get_response):
        def middleware(request):
            response = get_response(request)
            if not request.path == "confirm":
                try:
                    print(Cliente.objects.get(usuario_id=request.user.id))
                except Cliente.DoesNotExist:
                    return redirect('confirm')
            return response
        return middleware
    

    【讨论】:

      【解决方案2】:

      您应该使用类似 login_required 的装饰器,请参阅 Django authentication system 了解更多详细信息。

      例子:

      from django.contrib.auth.decorators import login_required
      
      @login_required(login_url="/your/login/view/url/")
      def my_view(request):
          ...
      

      根据docs,尽可能避免使用中间件进行任何类型的重定向

      中间件是 Django 请求/响应处理的挂钩框架。这是一个轻量级的低级“插件”系统,用于全局更改 Django 的输入或输出。

      换句话说,中间件用于处理请求和响应,如果您重定向到任何视图,您将(可能)递归地触发您的中间件。

      另一方面...

      以后你可能想添加一个匿名用户可以访问的视图,这个中间件会出问题...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-03
        • 2020-01-16
        • 1970-01-01
        • 2011-04-04
        • 2020-12-26
        • 2016-04-23
        • 1970-01-01
        • 2014-01-19
        相关资源
        最近更新 更多