# REST API Django ## Tecnologias - [Python](https://docs.python.org/3/) 3.12.0 - [Django](https://docs.djangoproject.com/en/4.2/) 4.2.5 - [Django REST Framework](https://www.django-rest-framework.org/) 3.14 - [Django REST Swagger](https://django-rest-swagger.readthedocs.io/en/latest/) - [Docker](https://docs.docker.com/) 24.0.6 y *([Docker-compose](https://docs.docker.com/compose/)* incluido con docker cli) - [PostgreSQL](https://www.postgresql.org/about/) - Git - GitHub Actions ```mermaid %%{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 **T**est **D**riven **D**eveloment ```mermaid %%{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
- [Dockerfile](./Dockerfile) - [.dockerignore](./.dockerignore) ```sh docker build . ``` - [docker-compose.yml](./docker-compose.yml) ```sh docker-compose build ``` ### Linting - Instalar `flake8` - [requirements.dev.txt](./requirements.dev.txt) - Configuración [flake8](./app/.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 ```sh docker-compose run -rm app sh -c "django-admin startproject app ." ``` ### Iniciar el servidor ```sh 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? ```mermaid %%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'natural'}}}%% flowchart subgraph " " direction LR TG["Trigger Push to GitHub"] JB["Job Run unit tests"] RS["Result 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`](./.github/workflows/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