Anmeldung und Redirect
-
26-09-2019 - |
Frage
Dies ist die Anmeldungs ??Ansichten:
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 = never_cache (Login)
Wenn ich zum Beispiel example.com/myblog/ dann war ich Umleitung zu example.com/accounts/login/?next=/myblog /
aber wenn ich Einsatz Benutzer und PSW für die Anmeldung dann war ich Umleitung / blogs / und nicht / myblog /
Warum?
Edit: request.REQUEST.get ( 'next', '') zurückkehren immer ''
Ich weiß nicht, warum: - \
Lösung
Wie funktioniert Ihre Login-Formular-Vorlage aussehen?
Ihr Problem
Sie senden nicht die redirect_to
Pfad zu Ihrer Vorlage und Sie sollten. Ihre Rückkehr sollte wie folgt aussehen:
return render_to_response('blogs.html', {
'formL': formL,
'next': redirect_to,
}, context_instance=RequestContext(request)
)
Die Login-Formular Aktion sollte wie folgt aussehen:
<form action="/your_login_url/?next={{ next }}" method="post">
Wenn Sie also /myblog/
gehen Sie zu /your_login_url/?next=/myblog/
weitergeleitet, macht die Login-Ansicht dann das Anmeldeformular und ersetzt die next
Variable in Login-Formular action-Attribute, so dass es wie /your_login_url/?next=/myblog/
aussieht und wenn Sie das Formular abschicken Sie erhalten angemeldet und umgeleitet zu /myblog/
(Sachen nach if request.method == 'POST':
wird ausgeführt).
Ihrer Ansicht nach redirect_to = request.REQUEST.get("next")
funktioniert gut, wenn Sie nur die Login-Seite GET
aber wenn Sie es POST
gibt es nicht next
Variablensatz in GET.
Auch Note
Anmelden Ansicht sollte Ihr Blog nicht machen, Blogs sehen sollte das tun.
Dies ist, wie Djangos zurückgegebene Antwort aussieht, beachten Sie die Zeile, wo es heißt redirect_field_name: redirect_to,
, redirect_field_name
den Wert next
standardmäßig hat.
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))
Und, scheinen Sie die Login-Ansicht zu überschreiben nur für Standard-Umleitung? Das ist nicht richtig IMHO. Der richtige Ort, um Set Standardposition für Login-Umleitung ist in Ihrem settings.py indem LOGIN_REDIRECT_URL .
Aber, da Sie Ihre eigene Login-Ansicht schreiben, warum nicht den in django als Skelett verwenden und erweitern Sie dann auf das, was Sie brauchen.
Andere Tipps
Da
not redirect_to or '//' in redirect_to or ' ' in redirect_to
den Wert true?
Vielleicht, wenn wir den Mann zu fischen zu lehren? http://docs.python.org/library/logging.html
Setzen Sie diese an der Spitze
import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
Setzen Sie dies, wo es in Ihrem Code (zB nach der if-Anweisung)
angemessen erscheintlogging.debug("redirect_to = %s" % redirect_to)
Ausführen es, dann schauen Sie sich den Inhalt von '/tmp/logging_example.out'