Redireccionar a otra página después de login

2,572 views
Skip to first unread message

Lucho Flores

unread,
Nov 2, 2013, 8:04:35 PM11/2/13
to djan...@googlegroups.com
Tengo una vista de login personalizada, pero la redirección no me está funcionando. Mi objetivo es que al poner por ejemplo 127.0.0.1:8000/productos/ y no estar logueado, se me mande a la página del login, y luego de loguearse, nuevamente regrese a 127.0.0.1:8000/productos/. Todo marcha bien, en la url aparece http://127.0.0.1:8000/login/?next=/productos/ pero al loguearme la redirección no funciona


Mi version de django es la 1.5 y esta es la vista:

from django.conf import settings
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.forms import AuthenticationForm

def login_view(request):
redirect_to = request.REQUEST.get('next', '')
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)

if user is not None and user.is_active and user.is_staff:
login(request, user)
if redirect_to:
return HttpResponseRedirect(redirect_to)
else:
return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)
else:
messages.add_message(request, messages.ERROR, 'Ud. no tiene permisos para acceder al sistema')
else:
messages.add_message(request, messages.ERROR, 'El nombre de usuario o la contraseña están incorrectos')
else:
form = AuthenticationForm()
ctx =  {'form':form}
return render(request, 'login.html',ctx)

Hiko hitokiri

unread,
Nov 2, 2013, 8:10:08 PM11/2/13
to djan...@googlegroups.com
yo utilizo el decorador de  @login_required(login_url = 'direccion_de_el_login')

Lucho Flores

unread,
Nov 2, 2013, 8:23:27 PM11/2/13
to djan...@googlegroups.com
Si amigo, pero eso no puedo poner en mi vista de login personalizada, porque se supone que aún no estoy logueado. Por tanto nunca me dejaría entrar al sistema


El 2 de noviembre de 2013 19:10, Hiko hitokiri <las...@gmail.com> escribió:
yo utilizo el decorador de  @login_required(login_url = 'direccion_de_el_login')

--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/django-es/eBBz7zw0jm0/unsubscribe. Para anular la suscripción a este grupo y todos sus temas, envía un correo electrónico a django-es+...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Hiko hitokiri

unread,
Nov 2, 2013, 8:42:32 PM11/2/13
to djan...@googlegroups.com
eso va en las vistas que necesitas estar logueado man no va en la de loggin

Lucho Flores

unread,
Nov 2, 2013, 8:47:57 PM11/2/13
to djan...@googlegroups.com
Eso ya lo se amigo, pero mi problema no está en las vistas en las que necesito estar logueado, porq ya tengo eso, mi problema es el método de login que realicé, q no me redirige a las otras vistas


El 2 de noviembre de 2013 19:42, Hiko hitokiri <las...@gmail.com> escribió:
eso va en las vistas que necesitas estar logueado man no va en la de loggin

--

Hiko hitokiri

unread,
Nov 2, 2013, 9:06:00 PM11/2/13
to djan...@googlegroups.com
ok ya entendi mira esto es lo que yo hago. habra una cosa mas elegante pero yo lo hago asi jajajaja

def vista_login(request):
#esta parte recolecta lo de next para hacer la redireccion claro si hay un next
try:
meta = request.META['QUERY_STRING'].split('=')[1][:-1]
except IndexError:
meta = None
foot = False
vista = 'Inicio de Seción'
error = ""
  if request.method == 'POST':
  formulario = LoginForm(request.POST)
  if formulario.is_valid():
  usuario = formulario.cleaned_data['usuario']
  contrasena = formulario.cleaned_data['contrasena']
  #paso de cotejamiento de el usuario y la contraseña ingresados en el formulario
  user = authenticate(username = usuario, password = contrasena)
  if user:
  if user.is_active:
  login(request, user)
  #esta parte redirecciona a la ista de donde fue enviado y si no fue redireccionado para login simplemente manda a pizarra
  if  meta:
return HttpResponseRedirect(meta)
else:
return HttpResponseRedirect('/pizarra')
else:
#mandamos el error para decir que no es bueno el usuario o la contraseña
error='El usuario o la contraseña son erroneos, Por favor ingrese los datos correctamente'
  else:
  formulario = LoginForm()
ctx ={'nombre_sistema': settings, 'foot': foot, 'vista': vista , 'formulario': formulario, 'error': error}
return render_to_response('index.html', ctx,context_instance = RequestContext(request))

Lucho Flores

unread,
Nov 2, 2013, 9:24:16 PM11/2/13
to djan...@googlegroups.com
Ya probé como tú dices, en la petición get no hay problema, puse un print en el método y me presenta el valor de meta, en este caso /productos/, pero cuando ya envío el formulario a través de post el valor de meta se setea a vacío y no me redirije a donde quiero


--

Lucho Flores

unread,
Nov 2, 2013, 9:25:54 PM11/2/13
to djan...@googlegroups.com
Así es como quedó la vista:
def login_view(request):
try:
meta = request.META['QUERY_STRING'].split('=')[1][:-1]
print meta
except IndexError:
meta = None

if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
print 'imprimiendo meta: %s' %meta
if user is not None and user.is_active and user.is_staff:
login(request, user)
if meta:
print 'aqui1'
return HttpResponseRedirect(meta)
else:
print 'aqui2'
return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)

else:
messages.add_message(request, messages.ERROR, 'Ud. no tiene permisos para acceder al sistema')
else:
messages.add_message(request, messages.ERROR, 'El nombre de usuario o la contraseña están incorrectos')
else:
form = AuthenticationForm()
ctx =  {'form':form}
return render(request, 'login.html',ctx)

Lucho Flores

unread,
Nov 2, 2013, 9:44:46 PM11/2/13
to djan...@googlegroups.com
He logrado solucionarlo
Al parecer la vista estaba bien, el problema era algo con el template de login, de todas maneras comparto el código de la solución:


La view:


def login_view(request):
redirect_to = request.REQUEST.get('next', '')
if request.user.is_authenticated():
return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None and user.is_active and user.is_staff:
login(request, user)
if redirect_to:
return HttpResponseRedirect(redirect_to)
else:
return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)
else:
messages.add_message(request, messages.ERROR, 'Ud. no tiene permisos para acceder al sistema')
else:
messages.add_message(request, messages.ERROR, 'El nombre de usuario o la contraseña están incorrectos')
else:
form = AuthenticationForm()
ctx =  {'form':form}
return render(request, 'login.html',locals())



Y en el template de login, específicamente en la definición del form (html):


<form action="./?next={{ redirect_to }}" method="POST">



Jesus Juarez

unread,
Jan 3, 2014, 6:59:13 PM1/3/14
to djan...@googlegroups.com
Puedes poner el codigo de html de to login template? quiero ver como empatas todo el codigo, porque yo tengo un login template personalizado.  Y quiero ver como lo empatas con tu codigo.

Gracias.
Reply all
Reply to author
Forward
0 new messages