Tutorial Django: Crea una API RESTful segura con Python y JWT
En este tutorial detallado, aprenderás a construir una API RESTful segura utilizando Django y Python. Está diseñado para desarrolladores principiantes e intermedios que desean dominar la creación de APIs robustas, con autenticación basada en tokens JWT para garantizar seguridad.
¿Qué aprenderás?
- Instalación y configuración de Django y Django REST Framework
- Creación de modelos y serializadores
- Implementación de vistas basadas en clases para operaciones CRUD
- Autenticación y autorización usando tokens JWT
- Pruebas básicas para la API
Este enfoque educativo, paso a paso y con buenas prácticas, te permitirá un aprendizaje sólido y práctico en desarrollo backend seguro.
Índice
- Instalación y configuración inicial
- Creación del modelo y serializador
- Implementación de vistas CRUD con vistas basadas en clases
- Configuración de autenticación JWT
- Pruebas básicas de la API
- Conclusión y buenas prácticas
Instalación y configuración inicial
Paso 1: Crear un entorno virtual
Es recomendable usar un entorno virtual para evitar conflictos con paquetes del sistema.
1 2 3 4 |
python -m venv env source env/bin/activate # Linux/macOS # env\Scripts\activate # Windows |
Paso 2: Instalar Django y Django REST Framework
Usaremos pip para instalar las dependencias necesarias.
1 2 |
pip install django djangorestframework djangorestframework-simplejwt |
django
: framework webdjangorestframework
: extensión para crear APIs RESTfuldjangorestframework-simplejwt
: para autenticación JWT
Paso 3: Crear un proyecto Django
1 2 3 |
django-admin startproject myapi cd myapi |
Paso 4: Crear una aplicación dentro del proyecto
1 2 |
python manage.py startapp core |
Paso 5: Configuración básica
Edita myapi/settings.py
para lo siguiente:
- Añade
'rest_framework'
y'core'
aINSTALLED_APPS
:
1 2 3 4 5 6 |
INSTALLED_APPS = [ # ... apps por defecto 'rest_framework', 'core', ] |
- Configura DRF para usar JWT por defecto (agregamos al final de settings.py):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from datetime import timedelta REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), } SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), } |
Paso 6: Migrar base de datos y crear superusuario
1 2 3 |
python manage.py migrate python manage.py createsuperuser |
Con esto tienes tu proyecto base listo para continuar.
Creación del modelo y serializador
Para comenzar, vamos a crear un ejemplo sencillo: un modelo para administrar Artículos.
Definir modelo Article
En core/models.py
:
1 2 3 4 5 6 7 8 9 10 11 |
from django.db import models class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() author = models.CharField(max_length=50) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title |
Migrar modelo
Ejecuta:
1 2 3 |
python manage.py makemigrations core python manage.py migrate |
Crear serializador
Los serializadores convierten instancias de modelos a JSON y viceversa.
En core/serializers.py
:
1 2 3 4 5 6 7 8 |
from rest_framework import serializers from .models import Article class ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article fields = ['id', 'title', 'content', 'author', 'created_at'] |
Esto manejará la validación y conversión automática.
Implementación de vistas CRUD con vistas basadas en clases
Para las operaciones CRUD usaremos las vistas genéricas que ofrece DRF.
Crear vistas en core/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from rest_framework import generics from rest_framework.permissions import IsAuthenticated from .models import Article from .serializers import ArticleSerializer class ArticleListCreateView(generics.ListCreateAPIView): queryset = Article.objects.all() serializer_class = ArticleSerializer permission_classes = [IsAuthenticated] class ArticleDetailView(generics.RetrieveUpdateDestroyAPIView): queryset = Article.objects.all() serializer_class = ArticleSerializer permission_classes = [IsAuthenticated] |
ListCreateAPIView
: lista y crea artículosRetrieveUpdateDestroyAPIView
: detalle, actualiza y borra artículo
Configurar URLs
Crea core/urls.py
:
1 2 3 4 5 6 7 8 |
from django.urls import path from .views import ArticleListCreateView, ArticleDetailView urlpatterns = [ path('articles/', ArticleListCreateView.as_view(), name='article-list-create'), path('articles/<int:pk>/', ArticleDetailView.as_view(), name='article-detail'), ] |
Luego enlaza en myapi/urls.py
:
1 2 3 4 5 6 7 8 |
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('core.urls')), ] |
Con esto, tu API tiene ahora endpoints para manejar CRUD de artículos, pero solo para usuarios autenticados.
Configuración de autenticación JWT
Vamos a permitir que usuarios obtengan tokens JWT para autenticarse.
Añadir URLs para autenticación JWT
Edita myapi/urls.py
para incluir rutas de token:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from django.urls import path, include from rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView, ) urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('core.urls')), # Autenticación JWT path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), ] |
Cómo funciona
POST /api/token/
: Recibeusername
ypassword
y devuelveaccess
yrefresh
tokens.POST /api/token/refresh/
: Recibe token refresh y devuelve un nuevo access token.
Probar autenticación vía la terminal (curl)
Supón que creaste un superusuario con usuario admin
y contraseña adminpassword
.
1 2 |
curl -X POST http://127.0.0.1:8000/api/token/ -d "username=admin&password=adminpassword" |
Respuesta JSON:
1 2 3 4 5 |
{ "refresh": "eyJ0eXAiOiJK...", "access": "eyJ0eXAiOiJK..." } |
Usar token para acceder a las rutas protegidas
Ejemplo para obtener lista de artículos:
1 2 |
curl -H "Authorization: Bearer eyJ0eXAiOiJK..." http://127.0.0.1:8000/api/articles/ |
O usando herramientas como Postman puedes agregar el token JWT en el header Authorization
.
Pruebas básicas de la API
Usar Postman o Insomnia
- Autentícate para obtener tokens JWT
- Utiliza el token access para llamar rutas
- Intenta:
- Crear un artículo (POST /api/articles/)
- Listar artículos (GET /api/articles/)
- Modificar (PUT /api/articles/{id}/)
- Eliminar (DELETE /api/articles/{id}/)
Ejemplo de prueba con Python requests
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import requests # Obtener token JWT response = requests.post('http://127.0.0.1:8000/api/token/', data={ 'username': 'admin', 'password': 'adminpassword' }) tokens = response.json() access_token = tokens['access'] # Usar token para crear artículo headers = {'Authorization': f'Bearer {access_token}'} data = { 'title': 'Primer artículo', 'content': 'Este es el contenido del artículo', 'author': 'Admin' } response = requests.post('http://127.0.0.1:8000/api/articles/', headers=headers, json=data) print(response.status_code) print(response.json()) |
Este código prueba la autenticación y la creación de un recurso en la API.
Conclusión y buenas prácticas
En este tutorial, has creado una API RESTful segura que incluye el flujo completo desde la instalación de Django hasta la protección con JWT:
- Instalaste y configuraste Django y Django REST Framework
- Diseñaste un modelo y su serializador para intercambio JSON
- Implementaste vistas basadas en clases para las operaciones CRUD
- Configuraste autenticación y autorización mediante tokens JWT
- Realizaste pruebas básicas para asegurarte de que el API responde como se espera
Buenas prácticas recomendadas
- Protege siempre tus endpoints con autenticación adecuada
- Usa entornos virtuales para aislar dependencias
- Separa lógica y capas (modelos, vistas, serializers)
- Maneja errores y valida datos con los serializadores
- Limita la vida de tus tokens JWT y permite refresco seguro
- Documenta tu API para facilitar mantenimiento
Próximos pasos
- Añadir paginación y filtros a tus vistas
- Documentar con Swagger o Redoc
- Implementar roles y permisos más detallados
- Desplegar la API usando Docker o servicios cloud
¡No dejes de practicar y mejorar tu API! Comparte tu proyecto, colabora y sigue aprendiendo sobre desarrollo backend seguro con Django.
¿Listo para crear APIs seguras y potentes? ¡Empieza hoy mismo con Django y convierte tu proyecto en una solución robusta y escalable!