Como Crear una API REST con Django 3.1.1 + Consumir Datos en una Aplicación Android – Parte 5
Demo
En la parte anterior llamada Como Crear una API REST con Django 3.1.1 + Consumir Datos en una Aplicación Android – Parte 4, creamos el EndPoint /postres, asimismo en la tabla postres insertamos un par de datos o postres, creamos el Serializer para listar los datos de postres, configuramos la ruta de este EndPoint y por último realizamos una prueba para verificar si este EndPoint /postres, devolvia datos. En esta parte 5 del tutorial, vamos a proteger los EndPoints mediante JWT (JSON Web Tokens), vamos con ello.
Partes
Antes de continuar te invito a leer los siguientes artículos:
- Que es Django, Historia y tu primer Hola Mundo (Corregido: 31-05-2019)
- Conceptos Iniciales para desplegar Django
- Como usar Django y React JS (Método Manual, no Librería)
- Como integrar Django y Bootstrap 4
- Como crear un CRUD con Django 3.1 (Python 3.9) y Bootstrap 4.6 – Parte 1
- 5 Servicios de Hosting VPS ideales para publicar un Proyecto Creado con Django
- Como Integrar Firebase en Django 3.0.7 – Parte 1
- 7 Proyectos que han sido Creados con Django Framework
- Puedes leer más en la categoría Django
Asimismo, te invito a escuchar el Podcast: “Como Mantenerte Motivado Para Seguir Programando”:
Spotify: | Sound Cloud: | Apple Podcasts |
Bien ahora continuemos con el Post: Como Crear una API REST con Django 3.1.1 + Consumir Datos en una Aplicación Android – Parte 5.
En la Parte 3 de este tutorial que consta de varias partes, instalamos el paquete Django REST Framework y en su documentación oficial nos brindan diferentes tecnologías para autenticarse, entre ellas esta JSON Web Authentication y nos comparten un enlace al paquete djangorestframework-simplejwt el cual va ser el que usaré para tener la tecnología JWT (JSON Web Token) en nuestra API REST.
Para instalar el paquete djangorestframework-simplejwt, ejecuto el siguiente comando:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
pip install djangorestframework-simplejwt Collecting djangorestframework-simplejwt Using cached djangorestframework_simplejwt-5.0.0-py3-none-any.whl (70 kB) Requirement already satisfied: djangorestframework in e:\old_h_xampp\htdocs\xampp\nc\tutoriales\blog\api_rest_django\mientornovirtual\lib\site-packages (from djangorestframework-simplejwt) (3.13.0) Requirement already satisfied: pyjwt<3,>=2 in e:\old_h_xampp\htdocs\xampp\nc\tutoriales\blog\api_rest_django\mientornovirtual\lib\site-packages (from djangorestframework-simplejwt) (2.3.0) Requirement already satisfied: django in e:\old_h_xampp\htdocs\xampp\nc\tutoriales\blog\api_rest_django\mientornovirtual\lib\site-packages (from djangorestframework-simplejwt) (4.0) Requirement already satisfied: pytz in e:\old_h_xampp\htdocs\xampp\nc\tutoriales\blog\api_rest_django\mientornovirtual\lib\site-packages (from djangorestframework->djangorestframework-simplejwt) (2021.3) Requirement already satisfied: asgiref<4,>=3.4.1 in e:\old_h_xampp\htdocs\xampp\nc\tutoriales\blog\api_rest_django\mientornovirtual\lib\site-packages (from django->djangorestframework-simplejwt) (3.4.1) Requirement already satisfied: tzdata; sys_platform == "win32" in e:\old_h_xampp\htdocs\xampp\nc\tutoriales\blog\api_rest_django\mientornovirtual\lib\site-packages (from django->djangorestframework-simplejwt) (2021.5) Requirement already satisfied: sqlparse>=0.2.2 in e:\old_h_xampp\htdocs\xampp\nc\tutoriales\blog\api_rest_django\mientornovirtual\lib\site-packages (from django->djangorestframework-simplejwt) (0.4.2) Installing collected packages: djangorestframework-simplejwt Successfully installed djangorestframework-simplejwt-5.0.0 WARNING: You are using pip version 20.2.3; however, version 21.3.1 is available. You should consider upgrading via the 'e:\old_h_xampp\htdocs\xampp\nc\tutoriales\blog\api_rest_django\mientornovirtual\scripts\python.exe -m pip install --upgrade pip' command. |
Paso seguido, debo registrar el paquete en el archivo settings.py que se encuentra en api_rest_django > settings.py
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/api_rest_django ├── /api_rest_django ├── /_pycache_ ├── _init_.py ├── asgi.py ├── settings.py // Abrimos este archivo ├── urls.py ├── wsgi.py ├── /mientornovirtual ├── db.sqlite3 ├── manage.py |
Abro el archivo settings.py y en la sección INSTALLED_APPS registro el paquete que acabo de instalar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'postres', 'jugos', 'rest_framework', 'rest_framework_simplejwt', # Registramos el paquete 'djangorestframework-simplejwt' ] |
Bien, ahora vamos a realizar algunas configuraciones para que el sistema de autenticación que desplegamos en la Parte 2 de este tutorial, se integre con la tecnología JWT (JSON Web Tokens).
Asi como creamos los modulos jugos y postres en partes anteriores, voy a crear también el modulo usuarios, pero solo usaré su archivo models.py ya que nuestro sistema de autenticación ya esta listo en si, para hacer una autenticación nativa en Django, esto porque en la Parte 2 de este tutorial, cuando ejecutamos las migraciones que nos trae por defecto Django al crear un nuevo proyecto, pues nos creo varias tablas, entre ellas una llamada auth_user y usaré esta misma tabla para autenticar usuarios en la API REST, también usaremos el propio sistema nativo y clases internas del mismo Django para la autenticación.
Voy a crear el módulo usuarios, para esto ejecuto el siguiente comando:
1 2 3 4 5 6 |
# Comando Para Crear el módulo 'usuarios' python manage.py startapp usuarios (mientornovirtual) |
Luego de ejecutar el comando anterior, en la consola no aparece nada y se me ha creado un directorio con el nombre usuarios que contiene un conjunto de carpetas y archivos indispensables para que este módulo funcione adecuadamente y dentro hay un archivo llamado models.py, abro ese archivo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/api_rest_django ├── /api_rest_django ├── /jugos ├── /mientornovirtual ├── /postres ├── /_pycache_ ├── migrations ├── __init__.py ├── admin.py ├── apps.py ├── models.py // Abro este archivo ├── serializers.py ├── tests.py ├── views.py ├── db.sqlite3 ├── manage.py |
Dentro del archivo models.py voy a comenzar importanto los modelos de base de datos y la clase AbstractUser. Luego creo una clase llamada Usuarios y le paso la clase AbstractUser dentro de parentesis, defino los campos de la tabla auth_user que quiero utilizar, estos son username, password, email y date_joined.
Finalmente defino el campo que será el nombre de usuario para iniciar sesión, para este tutorial usaré el email dentro de la variable USERNAME_FIELD, adicionalmente agrego la variable REQUIRED_FIELD en donde puedo definir que campos son requeridos, pero le colocaré un corchete de apertura y uno de cierre solamente. Si más adelante requiero definir campos requeridos en esta variable, pues lo haré, no hay problema.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from django.db import models from django.contrib.auth.models import AbstractUser # Campos de la tabla 'auth_user' class Usuarios(AbstractUser): username = models.CharField(max_length=150, default='DEFAULT VALUE') password = models.CharField(max_length=128, default='DEFAULT VALUE') email = models.CharField(max_length=254, default='DEFAULT VALUE', unique=True) date_joined = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'auth_user' # El nombre de la tabla de usuarios USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] |
Ahora pasaré a proteger las rutas o EndPoints /jugos y /postres de la API REST. Para ello abro el archivo views.py de cada módulo, es decir de jugos y postres. Primero comenzaré con el módulo jugos, abro el archivo views.py que se encuentra en api_rest_django > jugos > views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/api_rest_django ├── /api_rest_django ├── /jugos ├── /_pycache_ ├── migrations ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── serializers.py ├── tests.py ├── views.py // Abro este archivo ├── /mientornovirtual ├── /postres ├── db.sqlite3 ├── manage.py |
Dentro del archivo views.py del módulo jugos, importo la clase IsAuthenticated de Django Rest Framework. Paso seguido dentro de la clase JugosViewSet creo una variable con el nombre permission_classes y en su interior llamo a la clase IsAuthenticated.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
from django.shortcuts import render # Elementos necesarios para que el API REST funcione from rest_framework import viewsets from django.http import Http404 from rest_framework import status from rest_framework.response import Response # Clase 'JugosSerializer' from jugos.serializers import JugosSerializer # Modelo 'Jugos' from jugos.models import Jugos # Importo la clase 'IsAuthenticated' de Django Rest Framework from rest_framework.permissions import IsAuthenticated class JugosViewSet(viewsets.ModelViewSet): permission_classes = [IsAuthenticated] # Llamo a la clase 'IsAuthenticated' de Django Rest Framework queryset = Jugos.objects.all().order_by('id') serializer_class = JugosSerializer |
Con esto entonces, cuando el cliente intente acceder a los datos del EndPoint o ruta /jugos, pues se le solicitará que inicie sesión con su email y password la primera vez y posteriormente con un JWT (JSON Web Token), falta configurar la protección en el archivo urls.py, esto lo veremos más abajo.
Hago lo mismo con el módulo postres, abro el archivo views.py que se encuentra en api_rest_django > postres > views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/api_rest_django ├── /api_rest_django ├── /jugos ├── /mientornovirtual ├── /postres ├── /_pycache_ ├── migrations ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── serializers.py ├── tests.py ├── views.py // Abro este archivo ├── db.sqlite3 ├── manage.py |
Dentro del archivo views.py del módulo jugos, importo la clase IsAuthenticated de Django Rest Framework. Paso seguido dentro de la clase JugosViewSet creo una variable con el nombre permission_classes y en su interior llamo a la clase IsAuthenticated.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
from django.shortcuts import render # Elementos necesarios para que el API REST funcione from rest_framework import viewsets from django.http import Http404 from rest_framework import status from rest_framework.response import Response # Clase 'PostresSerializer' from postres.serializers import PostresSerializer # Modelo 'Postres' from postres.models import Postres # Importo la clase 'IsAuthenticated' de Django Rest Framework from rest_framework.permissions import IsAuthenticated class PostresViewSet(viewsets.ModelViewSet): permission_classes = [IsAuthenticated] # Llamo a la clase 'IsAuthenticated' de Django Rest Framework queryset = Postres.objects.all().order_by('id') serializer_class = PostresSerializer |
De la misma manera, cuando el cliente intente acceder a los datos del EndPoint o ruta /postres, pues se le solicitará que inicie sesión con su email y password la primera vez y posteriormente con un JWT (JSON Web Token), falta configurar la protección en el archivo urls.py, esto lo veremos a continuación.
Abro el archivo urls.py, este archivo se encuentra en api_rest_django > urls.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/api_rest_django ├── /api_rest_django ├── /_pycache_ ├── _init_.py ├── asgi.py ├── settings.py ├── urls.py // Abrimos este archivo ├── wsgi.py ├── /jugos ├── /mientornovirtual ├── /postres ├── /usuarios ├── db.sqlite3 ├── manage.py |
Dentro del archivo urls.py importo el paquete rest_framework_simplejwt, que me permite usar JWT (JSON Web Tokens) en mi proyecto.
Es importante recordar que para leer los EndPoints de mi API REST, necesito usar un cliente, puede ser por ejemplo una aplicación Android. Pero antes voy a crear 2 rutas, una para poder gener un primer token /api/token y otra para refrescar y obtener un nuevo token /api/token/refresh/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
"""api_rest_django URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/3.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import include, path from rest_framework.routers import DefaultRouter # Importamos Django REST Framework, también la vista 'jugos' y postres from jugos import views as jugos_views from postres import views as postres_views # Simple JWT from rest_framework_simplejwt import views as jwt_views router = DefaultRouter() router.register(r'jugos', jugos_views.JugosViewSet, basename='jugos') router.register(r'postres', postres_views.PostresViewSet, basename='postres') urlpatterns = [ path('admin/', admin.site.urls), path('', include(router.urls)), # Rutas para generar y refrescar los JWT (JSON Web Tokens) path('api/token/', jwt_views.TokenObtainPairView.as_view(), name='token_obtain_pair'), path('api/token/refresh/', jwt_views.TokenRefreshView.as_view(), name='token_refresh'), ] |
Ahora voy a verificar que se ha integrado correctamente la tecnología JWT (JSON Web Tokens) en mi proyecto, para ello haré uso de la herramienta Postman.
Si intento acceder a la ruta http://localhost:8000/jugos para listar los registros o jugos que hay en la tabla jugos de la base de datos, me devolverá el mensaje “detail”: “Authentication credentials were not provided.” Esto significa que debo enviarle un token para poder acceder a los datos.
Y si le paso un token, es decir un JWT (JSON Web Token), pues si me devuelve los datos de jugos respectivos.
La ruta para poder gener un primer token /api/token y otra para refrescar y obtener un nuevo token /api/token/refresh/ las podremos apreciar como funcionan cuando usemos la aplicación Android para leer los jugos y postres.
Ten Paciencia, lo que quiero es que conozcas bien como se crea este proyecto y no llenarte el capitulo de mucho contenido porque te puedes marear y no tendrás un óptimo aprendizaje.
Nota (s)
- En la siguiente parte vamos a trabajar en la aplicación Android, para acceder a los datos de la API REST.
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.
- Django Tutoriales
- 20-12-2021
- 18-02-2023
- Crear un Post - Eventos Devs - Foro