Login e redirecionar
-
26-09-2019 - |
Pergunta
Esta é a minha visualização de login:
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))
login = nunca_cache (login)
Quando vou, por exemplo, para exemplo.com/myblog/, então fui redirecionado para exemplo.com/accounts/login/?next=/myblog/
Mas quando eu insiro o usuário e o PSW para o login, fui redirecionado para /blogs /e não /myblog /
Por quê ?
EDIT: request.request.get ('Next', '') sempre retorna '' '
Eu não sei por que:-
Solução
Como é o seu modelo de formulário de login?
Seu problema
Você não está enviando o redirect_to
caminho para o seu modelo e você deve. Seu retorno deve ficar assim:
return render_to_response('blogs.html', {
'formL': formL,
'next': redirect_to,
}, context_instance=RequestContext(request)
)
A ação do formulário de login deve ficar assim:
<form action="/your_login_url/?next={{ next }}" method="post">
Então, quando você for para /myblog/
você é redirecionado para /your_login_url/?next=/myblog/
, a visualização de login renderiza o formulário de login e substitui o next
variável no atributo de ação do formulário de login para que pareça /your_login_url/?next=/myblog/
e quando você envia o formulário em que você está conectado e redirecionado /myblog/
(coisas depois if request.method == 'POST':
é executado).
Na sua opinião, redirect_to = request.REQUEST.get("next")
Funciona bem quando você apenas você GET
a página de login, mas quando você POST
para isso não há next
variável definida no get.
Observe também
A visualização de login não deve renderizar seu blog, a exibição de blogs deve fazer isso.
É assim que a resposta retornada de Django se parece, observe a linha onde ela diz redirect_field_name: redirect_to,
, redirect_field_name
tem o valor de next
por padrão.
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))
E você parece substituir a visualização de login apenas para redirecionamento padrão? Isso não está certo. O lugar certo para definir o local padrão para redirecionamento de login está em seus configurações. Login_redirect_url.
Mas, como você está escrevendo sua própria visualização de login, por que não usar o em Django como um esqueleto e depois expande o que você precisa.
Outras dicas
Porque
not redirect_to or '//' in redirect_to or ' ' in redirect_to
Avalia como verdadeiro?
Talvez se ensinarmos o homem a pescar?http://docs.python.org/library/logging.html
Coloque isso no topo
import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
Coloque isso onde parece apropriado em seu código (por exemplo, após a instrução IF)
logging.debug("redirect_to = %s" % redirect_to)
Execute -o e olhe para o conteúdo de '/tmp/logging_example.out'