Guía 26: Django - Django Admin (Autorización)#

Actividades previas#

Ambiente de desarrollo#

  1. Acceda a su proyecto django_data_monitor en Codespaces o en su máquina local.

  2. Cree y utilice la(s) rama(s) de desarrollo.

  3. Cree y habilite el ambiente virtual de desarrollo, con:

    python -m venv env
    
    env\Scripts\activate # Windows
    source env/bin/activate # Linux/MacOS
    
  4. Instale las librerías de requirements.txt, con:

    pip install -r requirements.txt
    

Actividades en clases#

Paquete: PyMySQL#

  1. Instale PyMySQL en su ambiente de desarrollo:

    pip install PyMySQL
    
  2. Utilice su cliente de IAG generativa para explicar el propósito del paquete PyMySQL en Python y cómo se utiliza para conectarse a bases de datos MySQL en Django.

Conexión a la base de datos#

  1. Edite el archivo backend_analytics_server/settings.py de su proyecto Django, con:

    1. Importe el paquete PyMySQL:

    ...
    from pathlib import Path
    import os
    import pymysql
    
    pymysql.install_as_MySQLdb()
    
    ...
    
    1. Reemplace la configuración por defecto por la conexión a la base de datos MySQL utilizando PyMySQL:

    ...
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': os.environ.get('MYSQLDATABASE'),
            'USER': os.environ.get('MYSQLUSER'),
            'PASSWORD': os.environ.get('MYSQLPASSWORD'),
            'HOST': os.environ.get('MYSQLHOST'),
            'PORT': os.environ.get('MYSQLPORT'),
         }
    }
    
    ...
    
  2. En la terminal establezca las variables de entorno para la conexión a la base de datos MySQL, con:

    # Linux/MacOS
    export MYSQLDATABASE=security
    export MYSQLUSER=root
    export MYSQLPASSWORD=root
    export MYSQLHOST=localhost
    export MYSQLPORT=3306
    
    # Verifique las variables de entorno
    echo $MYSQLDATABASE
    
    # Windows
    set MYSQLDATABASE=security
    set MYSQLUSER=root
    set MYSQLPASSWORD=root
    set MYSQLHOST=localhost
    set MYSQLPORT=3306
    
    # Verifique las variables de entorno
    echo %MYSQLDATABASE%
    

    Nota

    Asegúrese de reemplazar los valores con los datos correctos de su base de datos MySQL.

  3. Con MySQL Workbench o su cliente de MySQL, cree la base de datos security si no existe

  4. Utilice su cliente de IAG generativa para explicar cómo se configura la conexión a una base de datos MySQL en Django utilizando PyMySQL y las variables de entorno.

Migraciones de base de datos#

  1. Genere las migraciones de la base de datos, con:

    python manage.py makemigrations
    python manage.py migrate
    
  2. Cree un superusuario para acceder al panel de administración de Django, con:

    python manage.py createsuperuser
    
  3. Cree los usuarios usuario01 y usuario02, sin permisos o pertenencia a algún grupo

  4. Levante el servidor de desarrollo, con:

    python manage.py runserver
    
  5. Revise los cambios en el navegador con la URL http://127.0.0.1:8000/.

    Nota

    Compruebe que el acceso a la vista principal del dashboard redirige a la vista de inicio de sesión si no está autenticado.

Autorización#

Restricción de permiso: decorador @permission_required#

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

    ...
    from django.contrib.auth.decorators import login_required, permission_required
    
    @login_required
    @permission_required('dashboard.index_viewer', raise_exception=True)
    def index(request):
         ...
    
  2. Revise los cambios en el navegador con la URL http://127.0.0.1:8000/.

    Nota

    Compruebe que el acceso a la vista principal del dashboard requiere autorización para los usuarios usuario01 y usuario02; mientras, el superusuario tiene acceso sin restricciones.

  3. Utilice su cliente de IAG para explicar el uso del decorador @permission_required en Django.

Modelo con permisos#

  1. Edite el archivo dashboard/models.py, con la definición del modelo DashboardModel con permisos personalizados:

    ...
    # Create your models here.
    class DashboardModel(models.Model):
    
      class Meta:
         permissions = [
               ("index_viewer", "Can show to index view (function-based)"),
         ]
    
  2. Genere las migraciones de la base de datos, con:

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

    python manage.py runserver
    
  4. Use el panel de administración de Django http://127.0.0.1:8000/admin/, para:

    1. Modificar solo el usuario usuario01

    2. En User permissions, agregue el permiso Dashboard | dashboard model | Can show to index view (function-based).

    3. Guarde los cambios.

  5. Revise los cambios en el navegador con la URL http://127.0.0.1:8000/.

    Nota

    Compruebe que el usuario usuario01 puede acceder a la vista principal del dashboard, mientras que el usuario usuario02 recibe un error de autorización; mientras, el superusuario tiene acceso sin restricciones

  6. Utilice su cliente de IAG para explicar el uso de los permisos personalizados en modelos de Django y cómo se aplican a las vistas.

403 Forbidden#

  1. Descargue y descomprima el archivo 403.zip.

  2. Ubique el archivo 403.html en la carpeta templates/.

  3. Levante el servidor de desarrollo, con:

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

    Nota

    Compruebe que el usuario usuario02 recibe un error 403 Forbidden al intentar acceder a la vista principal del dashboard, y que se muestra la plantilla personalizada.

Gestión de dependencias#

  1. Genere el archivo requirements.txt con la lista de paquetes utilizados, con:

    pip freeze > requirements.txt
    
  2. Desactive el ambiente virtual de desarrollo, con:

    deactivate
    

Versionamiento#

  1. Versione local y remotamente la(s) rama(s) de desarrollo en el repositorio django_data_monitor.

    En caso de tener problemas de autenticación al realizar el versionamiento remoto:

    • Obtenga un Token de acceso personal (clásicos) de tipo Classic, con el alcance (scope) repo.

    • Copie el token, dado que no podrá volver a verlo.

    • Borre de memoria cualquier usuario/token que se estuviera guardando temporalmente

      git credential-cache exit
      
    • Elimine la configuración del credential helper definida a nivel global.

      git config --global --unset credential.helper
      
    • Reemplace los valores [REPO-OWNER], [REPO-NAME] y [TOKEN] para modificar el origin.

      git remote set-url origin https://[REPO-OWNER]:[TOKEN]@github.com/[REPO-OWNER]/[REPO-NAME].git
      
  2. Genere la(s) solicitud(es) de cambios (pull request) para la rama principal y apruebe los cambios.

Conclusiones#

Actividades autónomas#

Recursos extras#

En redes: