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

时间:2019-02-05 05:39:38

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的输入或输出。

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

另一方面,...

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