# Serializadores con Pydantic
## ¿Serializar?
* Proceso de conversión de datos.
* En desarrollo web: un serializador nos transforma y gestiona los datos complejos de entrada en datos nativos del lenguaje.
## Contexto
Micorservicios y comunicación asertiva

**¡¡Cuestión de datos!!**
## [¿Pydantic?](https://pydantic-docs.helpmanual.io/)
* Bliblioteca de python
* Sirve para:
* Anotaciones de tipos
* Gestión de datos
* (validaciones, estandares, json, etc.)
* Predecesores
* dataclass
```py
from dataclasses import dataclass
from typing import Tuple
class Topping(str, Enum):
mozzarella = 'mozzarella'
tomato_sauce = 'tomato sauce'
prosciutto = 'prosciutto'
basil = 'basil'
rucola = 'rucola'
@dataclass
class Pizza:
style: str
toppings: Tuple[Topping, ...]
>>> Pizza(2, ("pineapple", 24))
Pizza(style=2, toppings=('pineapple', 24))
# ----------------------- #
from pydantic import BaseModel
class Pizza(BaseModel):
style: str
toppings: Tuple[Topping, ...]
>>> try:
Pizza(style="Napoli", toppings=(2,))
except ValidationError as err:
print(err.json())
[
{
"loc": [
"toppings",
0
],
"msg": "value is not a valid enumeration member; permitted: 'mozzarella', 'tomato sauce', 'prosciutto', 'basil', 'rucola'",
"type": "type_error.enum",
"ctx": {
"enum_values": [
"mozzarella",
"tomato sauce",
"prosciutto",
"basil",
"rucola"
]
}
}
]
```
### [Type annotations](https://docs.python.org/3/library/typing.html#module-contents)
* [typing](https://docs.python.org/es/3/library/typing.html)
* [readme](https://fastapi.tiangolo.com/es/python-types/)
### Python data types
* int, str, float, list, dict, tuple, set...
* [to_json](https://docs.python.org/3/library/json.html#py-to-json-table)
### ¿Dónde están los serializadores?
* Todos los métodos: PUT, GET, POST, DELETE...
* Todas las formas: BODY, PATH Y QUERY
* Todos los momentos: REQUEST, RESPONSE
### Dinámico
Serializadores dinámicos: habrán restricciones y validaciones pero en el código todos es posible.
---==`Recordatorio mental: No hay que inventarse nada, ya todo esta hecho y solo hay que implementar`==
---
## Estándares
* [JSON schema](https://pydantic-docs.helpmanual.io/usage/schema/#json-schema-types)
* [Openapi](https://github.com/OAI/OpenAPI-Specification)
* Estándares internos
## Docs para el código
* [ReStructuredText](https://docutils.sourceforge.io/rst.html)
* [MarkDown](https://www.markdownguide.org/)
* [Openapi to pretty](https://nordicapis.com/7-open-source-openapi-documentation-generators/)
## [Repo aquí](https://github.com/SandoDev/workshop_pydantic)
## Otros links
* [good slides](http://slides.com/hultner/python-pizza-2020/)
* [podcast](https://www.pythonpodcast.com/pydantic-data-validation-episode-263/)
* [fastapi](https://fastapi.tiangolo.com/)
* [falcon](https://falcon.readthedocs.io/en/stable/)