Django Guia Rapida V - Sesiones y login


Esta entrada es continuacion de: Django Guia Rapida IV - Agregar CSS, JS e imagenes

En esta entrada vamos a ver el uso de sesiones en Django agregando la opcion de iniciar y terminar una sesion en nuestro proyecto de entrenamiento 'la muebleria'. Esto en el lado del usuario para que usuarios, que no son el administrador, puedan iniciar sesion. Para esto hay que habilitar el framework de sesiones de Django, sin mas preambulos, hacemos lo siquiente:

Paso 1-
Abrimos el archivo de configuracion del proyecto:

/muebleria/muebleria/settings.py




Buscamos el arreglo MIDDLEWARE_CLASSES y hay que asegurarnos que estan activas (descomentadas) las siguientes opciones:

'django.contrib.auth.middleware.AuthenticationMiddleware'
'django.contrib.sessions.middleware.SessionMiddleware',

Buscamos el arreglo INSTALLED_APPS y hay que asegurarnos que estan activas las opciones:

'django.contrib.sessions',
'django.contrib.auth',

En realidad por defecto ya vienen activas asi que en teoria solo hay que asegurarse de ello, si por alguna causa no estuvieran activas, o en procesos previos las hubieramos comentado o borrado ahora hay que activarlas de nuevo, si ese fuera el caso seria necesario volver a sincronizar la DB con el comando:

> python manage.py syncdb

Paso 2-
Abrimos el archivo de urls del proyecto:

/muebleria/muebleria/urls.py

Al inicio del archivo, en los import, agregamos la siguiente linea:

from django.contrib.auth.views import login, logout

Dentro del arreglo urlpaterns agreamos las dos lineas siguientes:

url(r'^login/$', login),
url(r'^logout/$', logout),

Ahora necesitamos preparar nuestras vistas para que se brinde la posibilidad de iniciar sesion.

Paso 3-
Agregaremos un formulario de iniciar sesion a nuestra vista base, archivo index.html, abrimos el archivo:

/muebleria/muebleria/templates/index.html

Agregamos codigo html para el formulario de login, algo basico:

<form method="post" action="/login/">
{% csrf_token %}
Usuario <input type="text" name="username">
Password <input type="password" name="password">
<input type="submit" value="Entrar" />
</form>

Lo anterior lo podemos agregar en donde queramos dentro del index, yo lo he agregado dentro del header donde esta el titulo del sitio, lo he puesto justo despues del <h1> del titulo. Es importante resaltar tres puntos:

  • La linea con el {% csrf_token %} sin esto el proceso de inicio de sesion no funcionara
  • El action del form se debe dirigir a /login/
  • En el formulario debe haber dos campos input uno llamado username tipo text y el otro llamado password tipo password.

Con lo anterior Django se encarga del proceso de login, comprobar el nombre y password ingresado y decidir si es correcto o no, pero aun no hemos terminado.

Ahora tenemos que hacernos cargo de que pasa si la autenficicacion falla o si es correcta. Si la autentificacion falla por default django reenvia el usuario a la url misitio.com/login/ Pero si lo hacemos
asi sin mas nos marcar un error por que no hemos creado ninguna vista para eso.

Paso 4-
Para solucionar eso en nuestra carpeta templates creamos una nueva carpeta llamada registration, asi:

/muebleria/muebleria/templates/registration

Dentro de esa carpeta creamos un archivo html llamado login.html y le ponemos lo siguiente:

{% extends 'index.html' %}
{% block title %}Muebleria{% endblock %}

{% block content %}
<p> Falló inicio de sesion verifica tus datos e intentalo de nuevo</p>
{% endblock %}

Lo cual basicamente nos lleva de regreso al index pero en lugar del contenido de portada nos muestra un mensaje de error al intentar iniciar sesion, igualmente podriamos volver a poner el formulario de login para intentar de nuevo, pero como ya es parte de nuestro index no tiene mucho caso repetirlo, aunque en un caso donde no fuera asi convendria poner dentro de este template el formulario de login.

Paso 5-
Si el inicio de sesion es exitoso Django nos redirije a la url misitio.com/accounts/profile/ como en el caso anterior si no preparamos una vista nos marcara error, pero en este caso tenemos una opcion si no queremos preparar una vista, redigir el caso de exito, lo redirigiremos al mismo index. Para esto en nuestro formulario de login agregamos un campo oculto, asi:

<input type="hidden" name="next" value="/">

Donde el value es la url al cual se redirije si la autentificacion es exitosa, puede ser el index (como en este caso) o alguna otra vista que tengamos.

Ahora otra cosa importante si la autentificacion es exitosa tenemos que modificar que nuestro formulario de login para que ya no se vea como tal, sino que se vea como un formulario de logout para cerrar la sesion (o que no se vea o cualquier otra idea que se nos ocurra). Para esto tendremos que comprobar el valor de request.user el cual es el objeto instanciado de nuestro usuario de sesion, para comprobar si hay sesion se usa el codigo de template siguiente:

{% if user.is_authenticated %}
{% endif %}

Entonces si queremos que nuestro formulario cambie su funcion al haber iniciado sesion tenemos que implementar la comprobacion con un if-else-endif dentro del template.

Paso 6-
Comprobando si hay sesion, usando nuestro formulario y adecuandolo para hacer logout ahora quedaria asi:

{% if user.is_authenticated %}
<form method="post" action="/logout/">
{% csrf_token %}
Bienvenido: {{user}}
<input type="submit" value="Salir" />
<input type="hidden" name="next" value="/">
</form>
{% else %}
<form method="post" action="/login/">
{% csrf_token %}
Usuario <input type="text" name="username">
Password <input type="password" name="password">
<input type="submit" value="Entrar" />
<input type="hidden" name="next" value="/">
</form>
{% endif %}

Noten que la primera opcion, si se cumple el if es el formulario de logout y su action es /logout/, ahi en vez de pedir los datos mostramos un mensaje de bienvenido nombre_usuario y el boton de salir, al cerrar sesion Django se encarga de cerrar la sesion y reenvia a la url misitio.com/logout o a next si lo especificamos como en el ejemplo, el cual reenvia a index.

¡Esta listo! Para hacer pruebas debemos tener un usuario creado, lo podemos crear entrando al area de administracion en el app users. Ahora nuestra pagina principal debe verse asi:



Si intentamos entrar con un usuario que no existe o poniendo mal los datos de algun usuario veremos el mensaje de fallo de inicio de sesion, si iniciamos sesion correctamente nuestro index debe verse asi:



Y con eso tenemos listo nuestro sitio trabajando con sesiones, no hubo que programar realmente nada solo configurar, como en el ejemplo del formulario de login/logout que usamos el codigo de template para saber si hay sesion o no, podemos  usar ese codigo en otras vistas para cargar contenido de acuerdo a si es un usuario con sesion iniciada o no quien hace la solicitud.

Hasta la siguiente guia, veremos CRUDS del lado de usuario.


Comentarios

Entradas populares