Django Rest API with docker
Go to file
2023-10-04 00:07:55 -03:00
.github/workflows init app recipies api 2023-10-04 00:07:55 -03:00
app init app recipies api 2023-10-04 00:07:55 -03:00
.dockerignore init app recipies api 2023-10-04 00:07:55 -03:00
.gitignore init app recipies api 2023-10-04 00:07:55 -03:00
docker-compose.yml init app recipies api 2023-10-04 00:07:55 -03:00
Dockerfile init app recipies api 2023-10-04 00:07:55 -03:00
README.md init app recipies api 2023-10-04 00:07:55 -03:00
requirements.dev.txt init app recipies api 2023-10-04 00:07:55 -03:00
requirements.txt init app recipies api 2023-10-04 00:07:55 -03:00

REST API Django

Tecnologias

%%{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 project
  • app/core/ código compartido entre multiples apps
  • app/user/ código relativo al usuario
  • app/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 Compose
    • run comienza un contenedor específico definido en la configuración
    • --rm remueve el contenedor
    • app es el nombre del servicio/applicación
    • sh -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