Introducción a Django REST Framework
Django REST Framework es una biblioteca poderosa y flexible para construir APIs web en Django. DRF incluye funcionalidades como:
Serialización de modelos
- Vistas basadas en clases para manejar endpoints
- Autenticación y permisos
- Documentación interactiva
2. Configuración Inicial
- Instalar Django REST Framework:
pip install djangorestframework
- Agregar DRF a INSTALLED_APPS en settings.py:
= [
INSTALLED_APPS # Otros apps...
'rest_framework',
]
- Configurar DRF (opcional): En settings.py, puedes definir configuraciones personalizadas:
1= {
REST_FRAMEWORK 2'DEFAULT_AUTHENTICATION_CLASSES': [
3'rest_framework.authentication.SessionAuthentication',
],4'DEFAULT_PERMISSION_CLASSES': [
5'rest_framework.permissions.IsAuthenticatedOrReadOnly',
], }
- 1
- REST_FRAMEWORK: Configuración principal de DRF.
- 2
- DEFAULT_AUTHENTICATION_CLASSES: Clases de autenticación predeterminadas.
- 3
- SessionAuthentication: Autenticación basada en sesiones.
- 4
- DEFAULT_PERMISSION_CLASSES: Clases de permisos predeterminadas.
- 5
- IsAuthenticatedOrReadOnly: Permite a los usuarios autenticados realizar operaciones de escritura.
3. Crear la API
- Crear un serializador para el modelo Medicamento:
1from rest_framework import serializers
2from .models import Medicamento
3class MedicamentoSerializer(serializers.ModelSerializer):
4class Meta:
5= Medicamento
model 6= '__all__' fields
- 1
- serializers: Módulo de DRF para serializar y deserializar datos.
- 2
- Medicamento: Modelo de Django.
- 3
- MedicamentoSerializer: Clase para serializar el modelo Medicamento.
- 4
- Meta: Clase interna para configurar el serializador.
- 5
- model: Modelo que se serializará.
- 6
- fields: Campos del modelo que se incluirán en la serialización.
Al serializar los modelos de Django, puedes especificar los campos que deseas incluir en la respuesta JSON. En este caso, fields = ‘__all__’ incluye todos los campos del modelo Medicamento. Este proceso de serizlización se conoce permite convertir los datos de un modelo en un formato que se puede enviar a través de la red, como JSON.
- Crear vistas para las APIs:
1from .models import Medicamento
2from .serializers import MedicamentoSerializer
3from rest_framework import viewsets
4class MedicamentoView(viewsets.ModelViewSet):
5= MedicamentoSerializer
serializer_class 6= Medicamento.objects.all() queryset
- 1
- Medicamento: Modelo de Django.
- 2
- MedicamentoSerializer: Serializador para el modelo Medicamento.
- 3
- viewsets: Módulo de DRF para vistas basadas en conjuntos.
- 4
- MedicamentoView: Vista para el modelo Medicamento.
- 5
- serializer_class: Clase de serializador para la vista.
- 6
- queryset: Conjunto de datos de medicamentos.
Con estas vistas basadas en conjuntos, DRF proporciona automáticamente las operaciones CRUD (Crear, Leer, Actualizar, Eliminar) para el modelo Medicamento.
- Configurar las rutas de la API: En urls.py:
1from django.urls import path, include
2from rest_framework.routers import DefaultRouter
3from .views import MedicamentoView
4= DefaultRouter()
router 5'medicamentos', MedicamentoView)
router.register(
6= [
urlpatterns 7'api/', include(router.urls)),
path( ]
- 1
- include: Función para incluir rutas de Django.
- 2
- DefaultRouter: Enrutador de DRF para vistas basadas en conjuntos.
- 3
- MedicamentoView: Vista para el modelo Medicamento.
- 4
- router: Enrutador predeterminado de DRF.
- 5
- router.register: Registra la vista MedicamentoView en el enrutador.
- 6
- urlpatterns: Lista de rutas de Django.
- 7
- include(router.urls): Incluye las rutas del enrutador en la ruta /api/.
4. Documentación con Swagger
Swagger es una herramienta para documentar APIs de forma interactiva. Puedes integrar Swagger en tu proyecto de Django REST Framework para proporcionar una documentación clara y detallada de tus APIs.
- Instalar dependencias para Swagger:
pip install drf-yasg
- Configurar Swagger en urls.py:
1from rest_framework import permissions
2from drf_yasg.views import get_schema_view
3from drf_yasg import openapi
4= get_schema_view(
schema_view 5
openapi.Info(6="API de Medicamentos",
title7='v1',
default_version8="Documentación interactiva de la API",
description
),9=True,
public10=(permissions.AllowAny,),
permission_classes
)
11+= [
urlpatterns 12'swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
path( ]
- 1
- permissions: Módulo de DRF para permisos.
- 2
- get_schema_view: Función para obtener la vista de Swagger.
- 3
- openapi: Módulo de drf-yasg para definir esquemas OpenAPI.
- 4
- schema_view: Vista de Swagger para tu API.
- 5
- Info: Clase para definir información de la API.
- 6
- title: Título de la API.
- 7
- default_version: Versión predeterminada de la API.
- 8
- description: Descripción de la API.
- 9
- public: Indica si la documentación es pública.
- 10
- permission_classes: Clases de permisos para acceder a la documentación.
- 11
- urlpatterns: Lista de rutas de Django.
- 12
- schema_view.with_ui(‘swagger’, cache_timeout=0): Vista de Swagger con interfaz interactiva.
En el archivo settings.py, agrega ‘drf_yasg’ a INSTALLED_APPS:
= [
INSTALLED_APPS # Otros apps...
1'drf_yasg',
]
- 1
- drf_yasg: App de Django para integrar Swagger.
Ver la documentación interactiva: Inicia el servidor y ve a http://localhost:8000/swagger/. Aquí podrás explorar y probar los endpoints de tu API directamente desde el navegador.
Otra documentación popular para APIs es Redoc, que puedes integrar en tu proyecto de DRF siguiendo los pasos en la documentación oficial de drf-yasg.
Para que funcione en nuestro proyecto en el archivo urls.py solo hace falta agregar la siguiente línea:
'redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'), path(
5. Pruebas con Thunder Client
Thunder Client es una extensión de VS Code para probar APIs similar a Postman, pero integrada en el editor.
- Instalar Thunder Client:
- Abre VS Code.
- Ve a la pestaña de extensiones (Ctrl+Shift+X).
- Busca Thunder Client e instálalo.
- Crear una colección de pruebas:
- Abre Thunder Client desde la barra lateral.
- Haz clic en New Request y selecciona el método (GET, POST, etc.).
- Ingresa la URL del endpoint, por ejemplo: http://localhost:8000/api/medicamentos/.
- Enviar una solicitud GET:
- Configura la URL y haz clic en Send.
- Verifica la respuesta en el panel de resultados.
- Prueba de solicitudes POST:
- Cambia el método a POST y selecciona el cuerpo (Body).
- Ingresa un JSON como este:
{
"nombre": "Amoxicilina",
"precio": 20.5,
"existencias": 30,
"lugar": "Almacén C"
}
- Haz clic en Send para verificar si el servidor crea correctamente un nuevo medicamento.
6. Pruebas Automatizadas de las APIs
- Agrega pruebas unitarias para validar los endpoints.
1from rest_framework.test import APITestCase
2from rest_framework import status
3from .models import Medicamento
4class MedicamentoAPITests(APITestCase):
5def setUp(self):
6self.medicamento = Medicamento.objects.create(
7="Paracetamol",
nombre8=10,
precio9=50,
existencias10="Almacén A"
lugar
)
11def test_lista_medicamentos(self):
12= self.client.get('/api/medicamentos/')
response 13self.assertEqual(response.status_code, status.HTTP_200_OK)
14def test_crear_medicamento(self):
15= {
data 16"nombre": "Ibuprofeno",
17"precio": 15,
18"existencias": 30,
19"lugar": "Almacén B"
}20= self.client.post('/api/medicamentos/', data)
response 21self.assertEqual(response.status_code, status.HTTP_201_CREATED)
22self.assertEqual(response.data['nombre'], data['nombre'])
23self.assertEqual(response.data['precio'], data['precio'])
24self.assertEqual(response.data['existencias'], data['existencias'])
25self.assertEqual(response.data['lugar'], data['lugar'])
26def test_detalle_medicamento(self):
27= self.client.get(f'/api/medicamentos/{self.medicamento.id}/')
response 28self.assertEqual(response.status_code, status.HTTP_200_OK)
29self.assertEqual(response.data['nombre'], "Paracetamol")
- 1
- APITestCase: Clase base para pruebas de API.
- 2
- status: Módulo de DRF para códigos de estado HTTP.
- 3
- Medicamento: Modelo de Django.
- 4
- MedicamentoAPITests: Clase de pruebas para la API de Medicamentos.
- 5
- setUp: Método para configurar datos de prueba.
- 6
- Medicamento.objects.create: Crea un medicamento en la base de datos.
- 7
- test_lista_medicamentos: Prueba para listar medicamentos.
- 8
- self.client.get: Realiza una solicitud GET a la API.
- 9
- test_crear_medicamento: Prueba para crear un medicamento.
- 10
- data: Datos del medicamento a crear.
- 11
- self.client.post: Realiza una solicitud POST a la API.
- 12
- test_detalle_medicamento: Prueba para obtener detalles de un medicamento.
- 13
- self.client.get: Realiza una solicitud GET a la API.
- 14
- response.data: Datos de la respuesta de la API.
- 15
- response.status_code: Código de estado de la respuesta.
- 16
- response.data[‘nombre’]: Nombre del medicamento en la respuesta.
- 17
- response.data[‘precio’]: Precio del medicamento en la respuesta.
- 18
- response.data[‘existencias’]: Existencias del medicamento en la respuesta.
- 19
- response.data[‘lugar’]: Lugar del medicamento en la respuesta.
- 20
- self.assertEqual: Compara dos valores en la prueba.
- 21
- self.medicamento.id: ID del medicamento creado en la base de datos.
- 22
- response.data[‘nombre’]: Nombre del medicamento en la respuesta.
- 23
- response.data[‘precio’]: Precio del medicamento en la respuesta.
- 24
- response.data[‘existencias’]: Existencias del medicamento en la respuesta.
- 25
- response.data[‘lugar’]: Lugar del medicamento en la respuesta.
- 26
- self.client.get: Realiza una solicitud GET a la API.
- 27
- response.status_code: Código de estado de la respuesta.
- 28
- response.data[‘nombre’]: Nombre del medicamento en la respuesta.
- 29
- status.HTTP_200_OK: Código de estado para una respuesta exitosa.
7. Conclusión
Con Django REST Framework, Swagger y Thunder Client, puedes desarrollar, documentar y probar APIs de manera eficiente. Este flujo de trabajo asegura que tus APIs sean robustas, fáciles de usar y bien documentadas para cualquier desarrollador o cliente que las consuma.