Django 条件登录重定向

Posted

技术标签:

【中文标题】Django 条件登录重定向【英文标题】:Django Conditional login redirect 【发布时间】:2019-06-17 00:50:38 【问题描述】:

这是我不断重定向的中间件。 如何在我的中间件中进行条件重定向?而不是路径名我怎么能得到path_name

中间件.py

class PermissionRequiredMiddleware:
   def __init__(self, get_response):
       self.get_response = get_response

   def __call__(self, request):
       response = self.get_response(request)
       return response

   def process_view(self, request, view_func, view_args, view_kwargs):

       assert hasattr(request, 'user')
       path = request.path_info

       if request.user.is_authenticated:
           if request.user.userprofile.user_role.id == 1 :
               return redirect('superadmin_dashboard')
           elif request.user.userprofile.user_role.id == 2 :
               return redirect('admin_dashboard')
           elif request.user.userprofile.user_role.id == 3 :
               return redirect('admin_dashboard')
           elif request.user.userprofile.user_role.id == 4 :
               return redirect('admin_dashboard')

【问题讨论】:

【参考方案1】:

您面临着不断的重定向,因为您发出的每个请求都会调用此中间件,这意味着它本身是递归调用的。所以你需要在中间件中设置一些条件来防止这种情况发生。

我认为你可以这样尝试:

    # lets say your url has name `login_url`
    # ie. (path('/login', name='login_url')

    login_url_name = 'login_url'
    current_url = resolve(request.path_info).view_name
    if request.method == "POST" and current_url == login_url_name:
        if request.user.pk:  # making sure a valid user has logged in. request always has user, but when its not logged in, its AnonymousUser object
            if request.user.userprofile.user_role.id == 1 :
                 return redirect('superadmin_dashboard')
            elif request.user.userprofile.user_role.id == 2 :
                 return redirect('admin_dashboard')
            elif request.user.userprofile.user_role.id == 3 :
                 return redirect('admin_dashboard')
            elif request.user.userprofile.user_role.id == 4 :
                 return redirect('admin_dashboard')
    return self.get_response(request)

【讨论】:

报错 - current_url = resolve(self.request.path_info).view_name AttributeError: 'PermissionRequiredMiddleware' object has no attribute 'request' 现在我删除了 self 然后它给出了错误 - RecursionError: maximum recursion depth exceeded while calling a Python object 可以分享一下stacktrace吗?

以上是关于Django 条件登录重定向的主要内容,如果未能解决你的问题,请参考以下文章

django:登录后重定向到引用页面[重复]

登录后 Django 重定向到仪表板

django 403 禁止 - 重定向到登录

登录 Django 后重定向到 Next

Django - 基于组在登录时重定向

Django 注册 url 重定向