Django Условное перенаправление входа - PullRequest
0 голосов
/ 23 января 2019

Это мое промежуточное ПО, которое постоянно перенаправляет. Как я могу дать условное перенаправление в моем промежуточном программном обеспечении? и вместо имени пути, как я могу получить path_name.

middleware.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 Ответ

0 голосов
/ 23 января 2019

Вы сталкиваетесь с непрерывным перенаправлением, потому что это промежуточное ПО вызывается для каждого запроса, который вы делаете, то есть он сам рекурсивно вызывает.Поэтому вам нужно поместить некоторые условия в промежуточное ПО, чтобы предотвратить это.

Я думаю, вы можете попробовать вот так:

    # 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)
...