El sistema de autenticación de Django, tiene una documentación muy completa incluyendo algunos ejemplos de uso. Abarcarlos todos puede complicar la didactica del curso, así que voy a implementar solamente estas funcionalidades que son más frecuentes:

  • Creación de usuarios
  • Autenticación de usuarios
  • Acceso restringido
  • Cierre de sesión

El sistema de autenticación necesita de django.contrib.auth. por lo tanto, es necesario agregar estas líneas a nuestro views.py:

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login, authenticate, logout
from django.contrib.auth.decorators import login_required

Si deseas puedes unir en una sola instrucción a UsertCreationForm y AuthenticationForm, solamente separados por comas, algo así: from django.contrib.auth.forms import UserCreationForm, AuthenticationForm

Creación de usuarios

Para crear usuarios (sin la interfaz administrativa de Django), podemos usar el formulario que viene con Django, su nombre es UserCreationForm from django.contrib.auth.forms import UserCreationForm, AuthenticationForm que pertenece a django.contrib.auth.forms.

Creamos la siguiente vista (nuevo_usuario):

nuevo_usuario()

nuevo_usuario()

Luego la siguiente plantilla (nuevousuario.html):

nuevousuario.html

nuevousuario.html

Y agregamos la siguiente línea a urls.py:

url(r'^usuario/nuevo$','principal.views.nuevo_usuario'),

Si accedemos a la URL: http://127.0.0.1:8000/usuario/nuevo veremos lo siguiente:

http://127.0.0.1:8000/usuario/nuevo

http://127.0.0.1:8000/usuario/nuevo

Podemos probar que crea un usuario nuevo, también puedes agregar un enlace a tus plantillas anteriores, para mejorar la navegación.

Autenticación de usuarios

Ahora vamos a crear la interfaz para el ingreso al sistema, para ello usaremos el formulario AuthenticationForm, que también pertenece a django.contrib.auth.forms y usaremos authenticate y login de django.contrib.auth.

Agregamos la siguiente vista(ingresar) :

ingresar()

ingresar()

Notar que existe una condicional que menciona “is_active”, eso nos indica que el usuario puede que exista en el sistema, pero también debe estar activo para poder ingresar.

Crearemos las plantillas (noactivo.html, nousuario.html e ingresar.html):

noactivo.html

noactivo.html

nousuario.html

nousuario.html

ingresar.html

ingresar.html

Agregamos la siguiente línea al urls.py:

    url(r'^ingresar/$','principal.views.ingresar'),

Al probarlo ingresamos a la dirección http://127.0.0.1:8000/ingresar/ , si tenemos un usuario inactivo (se puede activar o desactivar a un usuario desde la interfaz administrativa de Django), nos saldrá el contenido de la plantilla noactivo.html, si nos equivocamos de credenciales saldra nousuario.html y si le damos los datos adecuados, nos saldra el error 404, porque aún no hemos creado la vista para( /privado).

http://127.0.0.1:8000/ingresar/

http://127.0.0.1:8000/ingresar/

Usuario no activo

Usuario no activo

Error de autenticación

Error de autenticación

error 404

error 404

Acceso restringido

Para complementar nuestro ejemplo anterior (/privado) vamos a crear una vista que permita manejar esto, esta vista tendra la restricción de autenticación, quiere decir que se necesita ingresar al sistema para poder ver su contenido, para esto vamos a usar login_required que pertenece a django.contrib.auth.decorators, se usa mediante la sintaxis:

@login_required(login_url='/ingresar')

Esta línea se debe agregar antes de cada vista, para poder activar esta restricción, nuestra vista para privado quedaría de esta manera:

privado()

privado()

Notar que ahora usaremos los datos del modelo User de Django, la documentación de estos campos de usuario es de mucha ayuda.

Podríamos modificar nuestra vista ingresar para que no vuelva aparecer el formulario de registro, mientras el usuario ya se encuentra dentro del sistema, quedaría de la siguiente manera:

ingresar() mejorado

ingresar() mejorado

Fijarse que estás líneas fueron agregadas:

    if not request.user.is_anonymous():
        return HttpResponseRedirect('/privado')

Agregaríamos al urls.py:

 url(r'^privado/$','principal.views.privado'),

Y crearíamos la plantilla (privado.html):

privado.html

privado.html

Nuestro resultado sería:

acceso restringido

acceso restringido

Esto nos obligará a tener una manera de cerrar la sesión.

Cierre de sesión

Para el cierre de sesión necesitamos logout que se encuentra en django.contrib.auth, la vista sería tan simple como esto:

cerrar()

cerrar()

Y en urls.py está línea:

    url(r'^cerrar/$', 'principal.views.cerrar'),

Solo basta con ingresar a http://127.0.0.1:8000/cerrar/ y se cerrara la sesión.

El archivo urls.py quedaría, al final de todas las modificaciones, de la siguiente manera:

urls.py

urls.py

Repositorio del proyecto e Indicaciones finales

Si desean revisar el código completo del proyecto pueden hacerlo desde el repositorio en github, para comparar y resolver cualquier duda, eviten solo copiar y pegar, mejor escriban el código será más educativo.

Ya estamos a un capítulo para terminar nuestro curso básico de Django, quiero recordarles que este curso en Maestros del Web, tiene como objetivo, incentivar el uso de Python y Django a aquellos que conocen poco o nada de ellos. Lamento no poder abarcar temas más avanzados, como algunos piden por los comentarios, espero que comprendan que no lo hago porque corro el riesgo de que se vuelva complicado y no logre el objetivo.

La próxima semana terminamos el curso con el despliegue en el servidor y las opciones que tenemos para publicar nuestro proyecto, como todas las semanas sus comentarios y tweets enriquecen este curso, sigan haciéndolo.

Que tengan un buen inicio de semana :)