229 lines
5.2 KiB
Markdown
229 lines
5.2 KiB
Markdown
|
# 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
|
||
|
|