Вход и перенаправление
-
26-09-2019 - |
Вопрос
Это мои виды входа в систему:
def login(request):
redirect_to = request.REQUEST.get("next")
if request.method == 'POST':
formL = LoginForm(data=request.POST)
if formL.is_valid():
if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
redirect_to = "/blogs/"
from django.contrib.auth import login
login(request, formL.get_user())
if request.session.test_cookie_worked():
request.session.delete_test_cookie()
return HttpResponseRedirect(redirect_to)
else:
formL = LoginForm(request)
request.session.set_test_cookie()
return render_to_response('blogs.html', {
'formL': formL, }, context_instance=RequestContext(request))
логин = Never_cache(логин)
Когда я захожу, например, на example.com/myblog/, меня перенаправляют на example.com/accounts/login/?next=/myblog/.
но когда я вставляю пользователя и psw для входа в систему, меня перенаправляют в /blogs/, а не в /myblog/
Почему ?
Редактировать:request.REQUEST.get('next', '') всегда возвращает ''
Я не знаю почему :-\
Решение
Как выглядит ваш шаблон формы входа?
Твоя проблема
Вы не отправляете redirect_to
путь к вашему шаблону, и вам следует это сделать.Ваш возврат должен выглядеть так:
return render_to_response('blogs.html', {
'formL': formL,
'next': redirect_to,
}, context_instance=RequestContext(request)
)
Действие формы входа должно выглядеть следующим образом:
<form action="/your_login_url/?next={{ next }}" method="post">
Поэтому, когда вы идете в /myblog/
вы будете перенаправлены на /your_login_url/?next=/myblog/
, представление входа затем отображает форму входа и заменяет next
переменная в атрибуте действия формы входа в систему, поэтому она выглядит так /your_login_url/?next=/myblog/
и когда вы отправляете форму, вы входите в систему и перенаправляетесь на /myblog/
(вещи после if request.method == 'POST':
казнят).
По вашему мнению, redirect_to = request.REQUEST.get("next")
работает нормально, когда вы только GET
страница входа, но когда вы POST
для этого нет next
переменная, установленная в GET.
Также обратите внимание
Представление входа в систему не должно отображать ваш блог, это должно делать представление блогов.
Вот как выглядит возвращенный ответ Django, обратите внимание на строку, в которой говорится redirect_field_name: redirect_to,
, redirect_field_name
имеет значение next
по умолчанию.
return render_to_response(template_name, {
'form': form,
redirect_field_name: redirect_to,
'site': current_site,
'site_name': current_site.name,
}, context_instance=RequestContext(request))
И вы, кажется, переопределяете представление входа только для перенаправления по умолчанию?Это неправильно ИМХО.Правильное место для установки местоположения по умолчанию для перенаправления входа в систему — это ваш файл settings.py, установив LOGIN_REDIRECT_URL.
Но, поскольку вы пишете собственное представление входа в систему, почему бы не использовать его в django в качестве скелета, а затем расширить его тем, что вам нужно.
Другие советы
Так как
not redirect_to or '//' in redirect_to or ' ' in redirect_to
оценивает правду?
Может быть, если мы научим мужчине ловить рыбу?http://docs.cython.org/library/logging.html.
Поставить это на вершину
import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
Поместите это там, где это кажется подходящим в вашем коде (например, после оператора IF)
logging.debug("redirect_to = %s" % redirect_to)
Запустите его, затем посмотрите на содержимое «/tmp/logging_example.out»