Login y redirección
-
26-09-2019 - |
Pregunta
Este es mi punto de vista de inicio de sesión:
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)
Cuando voy, por ejemplo, a example.com/myblog/ entonces he estado redirección a example.com/accounts/login/?next=/myblog /
pero cuando inserto de usuario y PSW de entrada entonces he estado redirección a / blogs / no / myblog /
¿Por qué?
Editar: request.REQUEST.get ( 'siguiente', '') siempre vuelven ''
No sé por qué: - \
Solución
¿Cómo funciona su entrada mirada plantilla de formulario como?
Su problema
No está enviando el camino redirect_to
a su plantilla y que debería. Su declaración debe tener este aspecto:
return render_to_response('blogs.html', {
'formL': formL,
'next': redirect_to,
}, context_instance=RequestContext(request)
)
La acción de formulario de acceso debería tener este aspecto:
<form action="/your_login_url/?next={{ next }}" method="post">
Así que cuando vas a /myblog/
te redirige a /your_login_url/?next=/myblog/
, la vista de inicio de sesión a continuación, hace que la ventana de acceso y sustituye a la variable next
de identificación no son atributo de acción del formulario para que parezca que /your_login_url/?next=/myblog/
y al momento de enviar el formulario obtenido conectado y redirigido a /myblog/
(cosas después if request.method == 'POST':
es ejecutado).
En su opinión, redirect_to = request.REQUEST.get("next")
funciona bien cuando sólo GET
la página de inicio de sesión, pero cuando se POST
a que no hay next
conjunto variable en GET.
nota también
Identificación vista no debe hacer que su blog, los blogs de vista va a hacer eso.
Esta es la forma devueltos miradas de respuesta de Django como, tenga en cuenta la línea donde dice redirect_field_name: redirect_to,
, redirect_field_name
tiene el valor de next
por defecto.
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))
Y, parece que anular la vista de inicio de sesión única para la redirección de forma predeterminada? Esta no es mi humilde opinión la derecha. El lugar adecuado para definir la ubicación por defecto para la redirección de entrada está en su settings.py estableciendo LOGIN_REDIRECT_URL .
Sin embargo, dado que usted está escribiendo su propio punto de vista de inicio de sesión por qué no usar el uno en Django como un esqueleto y luego se expande en él lo que necesita.
Otros consejos
Debido
not redirect_to or '//' in redirect_to or ' ' in redirect_to
se evalúa como verdadera?
Tal vez si enseñamos el hombre a los peces? http://docs.python.org/library/logging.html
Ponga esto en la parte superior
import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
Ponga esto donde parece apropiado del código (por ejemplo, después de la sentencia if)
logging.debug("redirect_to = %s" % redirect_to)
Ejecutar, y luego mira el contenido de '/tmp/logging_example.out'