Это мое промежуточное ПО, которое постоянно перенаправляет.
Как я могу дать условное перенаправление в своем промежуточном программном обеспечении? и вместо имени пути, как я могу получить 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')





Вы сталкиваетесь с постоянным перенаправлением, потому что это промежуточное ПО вызывается для каждого вашего запроса, что означает, что оно рекурсивно вызывает себя. Поэтому вам нужно установить некоторые условия в промежуточном программном обеспечении, чтобы предотвратить это.
Я думаю, вы можете попробовать так:
# 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)
Теперь я удаляю себя, тогда выдает ошибку - RecursionError: maximum recursion depth exceeded while calling a Python object
не могли бы вы поделиться трассировкой стека, пожалуйста?
Выдает ошибку -
current_url = resolve(self.request.path_info).view_name AttributeError: 'PermissionRequiredMiddleware' object has no attribute 'request'