Guía 24

Guía 24

DAWM / Proyecto05

Objetivo general

Desarrollar una aplicación backend robusta y escalable utilizando Django que integre una interfaz de administrador intuitiva para la gestión eficiente de datos y funcionalidades junto con un REST API completo que facilite la comunicación con las aplicaciones cliente de tal forma que garantice la seguridad, el rendimiento y la extensibilidad del sistema.

Actividades previas

Ambiente de desarrollo

  1. Desde la línea de comandos

    • Cree y habilite el ambiente de desarrollo, con:
     python -m venv environment
     environment\Scripts\activate
    

Repositorio local/remoto + librerías

  1. Desde la línea de comandos

    • Clone localmente y acceda a la carpeta backend.
    • Instale las librerías de requirements.txt, con:
     pip install -r requirements.txt
    

SDK Firebase Admin: Clave privada

  1. Acceda a la consola de Firebase
  2. Ingrese al proyecto landing
    • Acceda a la Configuración de proyecto.
    • Genere y descargue una clave privada JSON.
  3. Cree la carpeta keys en el proyecto.
  4. Renombre el archivo como landing-key.json y guarde el archivo en la carpeta keys.

Editor y WSGI

  1. Abra el proyecto con VSCode, con:

     code .
    
  2. Levante el servidor, con:

     python manage.py runserver
    

Actividades en clases

Django Admin y SuperUsuario

  1. Aplique las migraciones

     python manage.py makemigrations
     python manage.py migrate
    
  2. Cree el SuperUsuario. Recuerde el usuario y la contraseña para probar el sistema de autenticación.

     python manage.py createsuperuser
    
  3. Levante el servidor, con:

     python manage.py runserver
    
  4. (STOP 1) Revise los cambios en el navegador en el URL: http://127.0.0.1:8000/admin

    • Acceda con el usuario y la contraseña del SuperUsuario

Autenticación: Decorador en la vista

  1. Edite el archivo main/views.py, con:

    • Importe el decorador login_required
    • Restricción de acceso para la vista index
     from django.http import ...
    
     # Importe el decorador login_required
     from django.contrib.auth.decorators import login_required
    
     # Restricción de acceso con @login_required
     @login_required
     def index(request):
         ...
    
  2. (STOP 2) Revise los cambios en el navegador en el URL: http://127.0.0.1:8000/

Autenticación: Vistas predefinidas + Plantilla personalizadas

  1. Descargue y descomprima la plantilla login_django.zip en la carpeta templates/security.
  2. Edite el archivo backend/urls.py, con:

    • Importe las vistas predefinidas auth_views.
    • Agregue las rutas con las vista (basadas en clases) asociadas con el inicio (LoginView) y con el cierre (LogoutView) de sesión.
     ...
     # Importe las vistas
     from django.contrib.auth import views as auth_views
    
     urlpatterns = [
         ...
    
         # Ruta login/ para la vista LoginView para inicio de sesión, uso de plantilla y alias
         path('login/', auth_views.LoginView.as_view(template_name='security/login.html'), name='login'),
            
         # Ruta logout/ para la vista LogoutView para fin de sesión, redirección y alias
         path('logout/', auth_views.LogoutView.as_view(next_page='/login/'), name='logout'),
     ]
    
  3. Modifique el archivo backend/settings.py, con:

    • Las rutas de redireccionamiento en los casos de fallo y de éxito.
     ...
    
     # Fallo: acceso sin autenticación
     LOGIN_URL = '/login/'
        
     # Éxito: luego de autenticación exitosa
     LOGIN_REDIRECT_URL = '/'
    
  4. (STOP 3) Revise los cambios en el navegador en el URL:

Inicio de sesión

  1. Edite el archivo templates/security/login.html

    • Agregue el método post y la URL para el action
    • Añada la etiqueta de plantilla CSRF con el token de seguridad único.
    • Agregue los atributos name a los elementos input.
     ...
     <!-- Método post y action para el URL (con el alias 'login') -->
     <form method="post" action="{% url 'login' %}">
         <!-- CSRF token -->
         {% csrf_token %}
         ...
    
         <!-- username -->
         <input name="username" ... >
         ...
    
         <!-- password -->
         <input name="password" ... >
         ...
     </form>
    
  2. (STOP 4) Revise los cambios en el navegador en el URL: http://127.0.0.1:8000/

    • Ingrese el usuario y contraseña del SuperUsuario.
    • Revise la cookie de sesión

Fin de sesión

  1. Modifique templates/main/partials/header.html en el bloque logout

    • Agregue el método post y la URL para el action
    • Añada la etiqueta de plantilla CSRF con el token de seguridad único.
     <!-- START - Block Logout -->
        
     <!-- Método post y action para el URL (con el alias 'logout') -->
     <form method="post" action="{% url 'logout' %}" class="w-full">
    
         <!-- CSRF token -->
         {% csrf_token %}
    
         <button ...>
          ...
         </button>
    
     </form>
     <!-- END - Block Logout -->
    
  2. Haga clic en el botón Log out

  3. (STOP 5) Revise los cambios en el navegador en el URL: http://127.0.0.1:8000/

Django Admin - Nuevo Usuario

  1. Acceda a sitio de Django Admin en http://127.0.0.1:8000/admin
    • Utilice las credenciales del SuperUsuario.
  2. Agregue las credenciales y datos generales de un usuario nuevo, con:

    • Acceda a la opción Users
    • Haga clic en el botón ADD USER
    • Complete los campos Username, Password y Password confirmation. Guarde los cambios con el botón SAVE
    • Complete los datos personales en Personal info. Guarde los cambios con el botón SAVE
  3. Salga del sitio de Django Admin con el botón LOG OUT
  4. (STOP 6) Revise los cambios en el navegador en el URL: http://127.0.0.1:8000/

    • Ingrese el usuario y contraseña recientemente creado.

Autorización: Decorador en la vista

  1. Edite el archivo main/views.py, con:

    • Importe el decorador permission_required
    • Restricción de permiso para la vista index
     ...
    
     # Importe el decorador login_required
     from django.contrib.auth.decorators import login_required, permission_required
    
     # Restricción de acceso con @login_required y permisos con @permission_required
     @login_required
     @permission_required('main.index_viewer', raise_exception=True)
     def index(request):
         ...
    
  2. (STOP 7) Revise los cambios en el navegador en el URL: http://127.0.0.1:8000/

Autorización: Modelo con permisos

  1. Modifique el archivo main/models.py, con:

     ...
    
     # Create your models here.
     class MainModel(models.Model):
            
         class Meta:
             permissions = [
                 ("index_viewer", "Can show to index view (function-based)"),
             ]
    
  2. Aplique las migraciones

     python manage.py makemigrations
     python manage.py migrate
    
  3. Levante el servidor, con:

     python manage.py runserver
    
  4. Revise los cambios en el navegador en el URL: http://127.0.0.1:8000/admin

    • Acceda con el usuario y la contraseña del SuperUsuario
    • Modifique el usuario nuevo con el permiso recientemente creado.
    • Guarde los cambios con el botón SAVE
    • Cierre la sesión en Django Admin.
  5. (STOP 1) Revise los cambios en el navegador en el URL: http://127.0.0.1:8000/

    • Ingrese el usuario y contraseña del usuario nuevo.

Versionamiento local y remoto

  1. En la línea de comandos

    • Genere el archivo requirements.txt con la lista de paquetes utilizados, con:
     pip freeze > requirements.txt
    
    • Desactive el ambiente de desarrollo, con:
     deactivate
    
  2. Versione local y remotamente.

Documentación

Fundamental

Términos

Built-in, CSRF, cookies, session, autenticación, autorización

Referencias