如何从 Django 中的中间件重定向 url?

How to redirect url from middleware in Django?

如何从中间件重定向 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

对服务器的每个请求都通过中间件。因此,当您转到 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

您应该使用类似 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

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

Middleware is a framework of hooks into Django’s request/response processing. It’s a light, low-level “plugin” system for globally altering Django’s input or output.

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

并且,另一方面...

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