Django Rest API with docker
.github/workflows | ||
app | ||
.dockerignore | ||
.gitignore | ||
docker-compose.yml | ||
Dockerfile | ||
README.md | ||
requirements.dev.txt | ||
requirements.txt |
REST API Django
Tecnologias
- Python 3.12.0
- Django 4.2.5
- Django REST Framework 3.14
- Django REST Swagger
- Docker 24.0.6 y (Docker-compose incluido con docker cli)
- PostgreSQL
- Git
- GitHub Actions
%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'basis'}}}%%
flowchart
subgraph " "
direction TB
SW{Swagger-UI}
subgraph APP["App Container"]
RF("REST Framework")
DJ("Django")
PY("Python")
end
subgraph DBC["DB Container"]
DB[(PostgreSQL)]
end
RF <--> SW
RF <--> DJ <--> PY
DB <--> DJ
end
Estructura del proyecto
app
Django projectapp/core/
código compartido entre multiples appsapp/user/
código relativo al usuarioapp/recipe/
código relativo a las recetas
TDD
Test Driven Develoment
%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'natural'}}}%%
flowchart
subgraph " "
direction LR
WT[Write Test]
RTF["Run Test
(Fails)"]
AF[Add Feature]
RTP["Run Test
(Passes)"]
RF[Refactor]
end
WT --> RTF --> AF --> RTP --> RF
RF --> RTP
- Esto proporciona un mejor entendimiento del código
- Permite realizar cambios con confianza
- Reduco bugs
Unitests
- Código que prueba código
- Establecer condiciones/entradas
- Correr fragmentos de código
- Verificar salidas con
assertions
- Beneficios
- Asegurar que el código corre como se espera
- Atrapar bugs
- Mejorar fiabilidad
- Proporciona confianza
Docker
¿Por qué usar Docker?
- Consistencia entre ambientes de desarrollo y producción
- Facilita la colaboración entre desarrolladores
- Todas las dependencias como código
- Requerimientos de Python
- Dependencias del S.O.
- Facilidad para limpiar el sistema (post-dev)
- Ahorro de tiempo
¿Como usar Docker?
- Crear dockerfile
- Crear docker compose configuration
- Correr todos los comandos usando Docker compose
Docker con GitHub Actions
- Docker Hub tiene un limite de acceso:
- 100 pulls/6 hr para usuarios sin authentificación
- 200 pulls/6 hr para usuarios con authentificación
- GitHub Actions es un servicio compartido
- 100 pulls/6 hr considera TODOS los usuarios
- Autenticación con Docker Hub
- Crear cuenta
- Configurar credenciales
- Login antes de correr un trabajo (job)
- Obtener 200 pulls/6 hr gratis
Configurar Docker
- Creación dockerfile
- Lista de pasos para crear imagen
- Escoger una imagen basada en python
- Instalar dependencias
- Establecer usuarios
Docker Compose
- Como se debe utlizar la imagen de docker
- Definir servicios
- Nombre (ej. app)
- Mapeo de puertos
- Mapeo de volumenes
- Correr todos los comandos a travez de Docker Compose
ej.docker-compose run --rm app sh -c "python manage.py collectstatic"
docker-compose
Ejecuta un comando de Docker Composerun
comienza un contenedor específico definido en la configuración--rm
remueve el contenedorapp
es el nombre del servicio/applicaciónsh -c
pasa una orden a la shell del container"python manage.py ..."
comando a correr dentro del contenedor
docker build .
docker-compose build
Linting
- Instalar
flake8
- requirements.dev.txt
- Configuración flake8
- Correr a travez de docker-compose
docker-compose run --rm app sh -c "flake8"
Testing
- Django test suite
- Configurar test por cada applicación Django
- Correr a travez de docker-compose
docker-compose run --rm app sh -c "python manage.py test"
Creación del proyecto Django
docker-compose run -rm app sh -c "django-admin startproject app ."
Iniciar el servidor
docker-compose up
GitHub Actions
- Herramienta de automatización
- Similar a Travis-CI, GitLab CI/CD, Jenkins
- Ejecuta tareaas cunado el código cambia
- Tareas automatizadas comunes:
- Despliege/implementación
- Code Linting
- Tests Unitarios
Funciona con Trigger ej. push
to GitHub
¿Como funciona?
%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'natural'}}}%%
flowchart
subgraph " "
direction LR
TG["<b>Trigger</b>
Push to GitHub"]
JB["<b>Job</b>
Run unit tests"]
RS["<b>Result</b>
Success/fail"]
end
TG ==> JB ==> RS
Costo
- Se cobra por minutos de uso
- 2.000 minutos gratis
Configranción GitHub Actions
- Creación de archivo
checks.yml
- Set Trigger
- Añadir passos para correr pruebas y linting
- Configurar DockerHub auth
- Necesitado para jalar imagenes base
- Limites:
- Anónimos: 100/6h
- Atentificado 200/6h
- GitHub Actions usan IP compartida, la limitación aplica para todos los usuarios al autenticar con DockerHub se obtienen 200/6h de uso exclusivo