Skip to content

Latest commit

 

History

History
 
 

Ejemplo-03

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Backend con Python > Sesión 04 > Ejemplo-03

Ejemplo 03: Definiendo y agregando autenticación de entrada usando el modelo User de Django

Objetivo

  • Hacer uso de el modelo User de Django
  • Crear autenticación de entrada para una página de la aplicación

Desarrollo

Para este ejemplo usaremos el siguiente modelo entidad relación.

Modelo entidad-relación para Bedutravels

Lo primero es explorar el modelo mediante el shell de Django. Iniciar el shell de Django:

   Ejemplo-01/Bedutravels $ python manage.py shell
   Python 3.7.3 (default, Mar 27 2019, 22:11:17)
   [GCC 7.3.0] on linux
   Type "help", "copyright", "credits" or "license" for more information.
   (InteractiveConsole)
   >>>

Listando los registros en el modelo User:

   >>> from django.contrib.auth.models import User
   >>> User.objects.all()
   <QuerySet [<User: bedutravels>]>
   >>> u1 = User.objects.get(pk=1)
   >>> u1.username
   'bedutravels'
   >>> u1.email
   '[email protected]'

Validando datos de usuario contra los datos del modelo User:

   >>> from django.contrib.auth import authenticate
   >>> username = "bedutravels"
   >>> password = "bedu"
   >>> authenticate(username=username, password=password)
   >>> acceso = authenticate(username=username, password=password)
   >>> print(acceso)
   None
   >>> acceso == None
   True
   >>> password = "bedutravels"
   >>> acceso = authenticate(username=username, password=password)
   >>> acceso
   <User: bedutravels>

Modificando la vista login() para incluir la validación usando el modelo User de Django.

Modificando los import para poder utilizar la funciones authenticate y login:

from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from .models import User, Zona, Tour

import datetime

Modificar la función login() de la sigiente manera:

def login_user(request):
    """ Atiende las peticiones de GET /login/ """

    # Si hay datos vía POST se procesan
    if request.method == "POST":
        # Se obtienen los datos del formulario
        username = request.POST["username"]
        password = request.POST["password"]
        next = request.GET.get("next", "/")
        acceso = authenticate(username=username, password=password)
        if acceso is not None:
            # Se agregan datos al request para mantener activa la sesión
            login(request, acceso)
            # Y redireccionamos a next
            return redirect(next)
        else:
            # Usuario malo
            msg = "Datos incorrectos, intente de nuevo!"
    else:
        # Si no hay datos POST
        msg = ""
[...]

Como estamos importando la función login() de Django, tenemos que cambiar el nombre de nuestra función para que no entren en conflicto, así que la renombramos a login_user().

Ahora como cambiamos el nombre de la vista, hay que actualizar la ruta en urls.py:

path("login/", views.login_user, name="login_user"),

Se agrega el decorador a la vista que necesita ser autenticada:

@login_required()
def index(request):
    """ Vista para entender la petición de la url / """

    # Se obtiene la lista de todos los Tours y Zonas
    tours = Tour.objects.all()
    zonas = Zona.objects.all()
[...]

Se le indica a Django que la url para el login es /login/ agregando la siguientes líneas al archivos Bedutravels/Bedutravels/settings.py:

# Se define la URL para login
LOGIN_URL = "/login/"

Ahora cada vez que se abra la url / si no se está registrado en el sistema, no se podrá entrar a ver la lista de tours.

Modificando el archivo index.html para indicar cuando hay usuario activo o no.

Realizar las siguientes modificaciones al archivo Bedutravels/tours/templates/tours/index.html:

   <nav class="menu_main">
       <a class="marca" href="#">
         <strong>BEDUTRAVELS</strong>
       </a>
       <div>
         <a href="#">{{ user.username }}</a>
         <a href="/logout/">Salir</a>
       </div>
   </nav>

Las plantillas o archivos html siempre reciben la información del usuario actual activo.

Felicidades! Otro éxito más