Redirect некорректно преобразует специальные символы при перенаправлении в django
У меня есть страница в моем приложении django, которая требует аутентификации. Если пользователь нажимает mydomian/my_page
, представление оценивает, аутентифицирован ли запрос. Если запрос аутентифицирован, то он будет перенаправлен на нужную html-страницу (my_page.html
). Если запрос не аутентифицирован, запрос будет перенаправлен на страницу входа в систему с редиректом:
class MyView(View):
def get(self, request):
user = request.user
context = {
'username': user.username
}
if user.is_authenticated and user.is_staff:
return render(request,
'path/to/my_page.html',
context)
logout(request)
return redirect('/admin/login?next=/my_page')
Это работало довольно хорошо, когда неаутентифицированный пользователь нажимал mydomain/my_page
, он направлялся на mydomain/admin/login/?next=/my_page
, а после аутентификации он направлялся на mydomain/my_page
, который обслуживал path/to/my_page.html
.
Теперь я обновился до последней версии django, и перенаправление изменилось: когда неаутентифицированный запрос попадает на мою страницу, он перенаправляется на этот url mydomain/admin/login/?next=/admin/login%3Fnext%3D/my_path
. Когда на этой странице происходит логин, страница перенаправляется на mydomain/admin
вместо mydomain/my_page
. Затем, когда я вызываю mydomain/my_page
, она перенаправляется на нужную страницу (поскольку запрос аутентифицирован).
Я попробовал заменить перенаправление на
return HttpResponseRedirect((('/admin/login?next=/my_page').encode('utf-8')))
но не сработало. Я также не смог найти ничего в документации django о том, можно ли и как изменить метод перенаправления.
Есть идеи?
После просмотра документации здесь и здесь я понял, что редирект теперь хочет слеш после admin.
так что это return redirect('/admin/login/?next=/my_page')
решило мою проблему. В противном случае он добавляет предоставленную ссылку к моему url.