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

问题描述 投票:2回答:2

如何从中间件重定向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
2个回答
2
投票

每个服务器请求都通过中间件。因此,当您要访问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

0
投票

您应该使用像装饰者一样的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的输入或输出。

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

而另一方面......

将来,您可能希望添加一个匿名用户可以访问的视图,这个中间件将是一个问题......

© www.soinside.com 2019 - 2024. All rights reserved.