recipes_api/README.md

229 lines
5.2 KiB
Markdown
Raw Normal View History

2023-10-04 00:07:55 -03:00
# REST API Django
<style>div.mermaid{text-align: center;}</style>
## 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
<br>
- [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["<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`](./.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