Introducción a FastAPI

1

¿Qué es FastAPI? con Sebastián Ramírez @Tiangolo

2

Instalación de FastAPI y creación de tu primera aplicación

3

Documentación automática con Swagger

4

Métodos HTTP en FastAPI

FastAPI Path Operations

5

Método GET en FastAPI

6

Crear parámetros de ruta en FastAPI

7

Parámetros Query en FastAPI

8

Método POST en FastAPI

9

Métodos PUT y DELETE en FastAPI

Validaciones con Pydantic

10

Creación de esquemas con Pydantic

11

Validaciones de tipos de datos con Pydantic

12

Validaciones de parámetros con Pydantic

13

JSONResponse: Tipos de respuestas en FastAPI

14

Códigos de estado HTTP en FastAPI

Autenticación en FastAPI

15

Flujo de autenticación en FastAPI

16

Generando tokens con PyJWT

17

Validando tokens con PyJWT

18

Middlewares de autenticación en FastAPI

Conexión con bases de datos en FastAPI

19

SQLAlchemy: el ORM de FastAPI

20

Instalación y configuración de SQLAlchemy

21

Creación de modelos con SQLAlchemy

22

Registro de datos con SQLAlchemy

23

Consulta de datos con SQLAlchemy

24

Modificación y eliminación de datos con SQLAlchemy

25

SQLModel: el futuro ORM de FastAPI

Modularización

26

Manejo de errores y middlewares en FastAPI

27

Creación de routers en FastAPI

28

Servicios para consultar datos

29

Servicios para registrar y modificar datos

Despliegue de Aplicación en FastAPI

30

Preparando el proyecto para desplegar a producción

31

¿Cómo elegir entre GitHub y GitLab?

32

Crear repositorio en GitLab

33

Crear Droplet en Digital Ocean

34

Instalación de herramientas para el servidor

35

Ejecutando FastAPI con NGINX

Próximos pasos

36

¿Quieres más cursos de FastAPI?

Bonus

37

Cómo crear una API de alto rendimiento en tiempo récord - Sebastián Ramírez

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de FastAPI

Curso de FastAPI

Pablo España

Pablo España

Validaciones de parámetros con Pydantic

12/37
Recursos

Aportes 10

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En el reto de esta clase en `class Movie`: ```python id: Optional[int] = None title: str = Field(min_length=5, max_length=15) #con Field se le valida cuando tenga menos de 15 caracteres, tambien se le puede sumar la caracteristica default="algo" overview: str = Field(min_length=15, max_length=50) year: int = Field(le=2024) #con la abreviatura "le" se especifica que el numero sea menor a 2024 rating: float = Field(ge=1, le=10) #ge: mayor o igual que, le: menor o igual que category: str = Field(min_lenght = 5, max_lengh = 15) ```
aclaratoria: En **FastAPI**, tanto `Query` como `Path` son clases que se utilizan para extraer valores de la solicitud HTTP, pero provienen de diferentes partes de la solicitud y tienen propósitos distintos. ### 1. `Query` * Se usa para obtener **parámetros de consulta** (query parameters), que forman parte de la URL después del signo `?`. * Los parámetros de consulta son opcionales y se utilizan típicamente para modificar o filtrar la solicitud. * Ejemplo de una URL con parámetros de consulta: `example.com/items?skip=0&limit=10`. Aquí, `skip` y `limit` son parámetros de consulta. En este ejemplo, `skip` y `limit` son obtenidos de los **query parameters**. Si no se proveen en la solicitud, toman los valores por defecto (0 y 10). ### 2. `Path` * Se usa para extraer **parámetros de ruta** (path parameters), que son parte de la URL en sí. * Los parámetros de ruta son obligatorios y están embebidos directamente en la estructura de la URL. * Ejemplo de una URL con parámetros de ruta: `/example.com/items/123`. Aquí, `123` es un parámetro de ruta. En este ejemplo, `item_id` es obtenido de la **ruta** y es obligatorio.
* `Query`: Se utiliza para parámetros opcionales que vienen después del `?` en la URL (parámetros de consulta). * `Path`: Se utiliza para parámetros obligatorios que forman parte de la estructura de la URL (parámetros de ruta).
It is Mine Class Movies COxde bellow:\n ```js from pydantic import BaseModel, Field from typing import Optional class Movies(BaseModel) : id : Optional[int] = None title : str = Field(default="My Tiny film", min_length=4, max_length=16) overview: str = Field(default="Film Description", min_length=12, max_length=32 ) year : int = Field(default=2022, le=2024) rating : float = Field(ge=1, le=10) category : str = Field(min_length=4, max_length=16) class Config : model_config = { "json_schema_extra": { "examples": [ { "id": 1, "title": "My Tiny Film", "overview": "My Little Description", "year": 22020, "rating": 9.4, "category": "Sci Fi" } ] } } ```from pydantic import BaseModel, Fieldfrom typing import Optional class Movies(BaseModel) : id : Optional\[int] = None title : str = Field(default="My Tiny film", min\_length=4, max\_length=16) overview: str = Field(default="Film Description", min\_length=12, max\_length=32 ) year : int = Field(default=2022, le=2024) rating : float = Field(ge=1, le=10) category : str = Field(min\_length=4, max\_length=16) class Config : model\_config = { "json\_schema\_extra": { "examples": \[ { "id": 1, "title": "My Tiny Film", "overview": "My Little Description", "year": 22020, "rating": 9.4, "category": "Sci Fi" } ] } }
Aqui dejo mi aporte del reto anterior ```python class Movie(BaseModel): id: Optional[int] = None title: str = Field(min_length=5, max_length=15) overview: str = Field(min_length=15, max_length=50) year: str = Field(le=2022, default=2022) rating: float = Field(le=100.0, ge=0.0) category: str = Field(min_length=5, max_length=15) class Config: schema_extra = { "example": { "id": 1, "title": "Avatar", "overview": "En un exuberante planeta llamado Pandora viven los Na'vi, seres que ...", "year": 2022, "rating": 7.8, "category": "Acción" } } ```

reto del rating la abreviacion ge significa greater or equal, y la lt less than

class Movie(BaseModel):
    id : Optional[int] | None
    title : str = Field(min_length = 5, max_length= 15)
    overview : str = Field(min_length =15, max_length= 50)
    year : int = Field(le=2022)
    rating: float = Field(ge=0, lt=100)
    category : str
Mi hermoso código: ```js from fastapi import FastAPI, Body, Path, Query from fastapi.responses import HTMLResponse from pydantic import BaseModel, Field from typing import Optional app = FastAPI() app.title = "My app with FastAPI" app.version = "0.0.1" class Movie(BaseModel): id: Optional[int] = None title: str = Field(max_length=30, min_length=1) overview: str = Field(max_length=55, min_length=1) year: int = Field(le=2024) rating: float = Field(ge=1, le=10) category: str = Field(max_length=30, min_length=1) class Config: json_schema_extra = { "example": { "id":3, "title":"My_Movie_Name", "overview":"My_Movie_Description_or_overview", "year":2024, "rating":10, "category":"My_Movie_Type" } } movies = [ { "id":1, "title":"Avatar", "overview":"On a lush planet called Pandora live the Na'vi, beings who...", "year":2009, "rating":7.8, "category":"Action" }, { "id":2, "title":"Titanic", "overview":"Titanic, launched on May 31, 1911, and set sail on its maiden...", "year":1997, "rating":7.9, "category":"Romantic/Adventure" } ] @app.get("/", tags=["home"]) def message(): return HTMLResponse("

Hello world

") @app.get("/movies", tags=["movies"]) def get_movies(): return movies @app.get("/movies/{id}", tags=["movies"]) def get_movie(id: int = Path(ge=1, le=2000)): result = [item for item in movies if item["id"] == id] return result[0] if result else {"error": "id does not exist in our database"} @app.get("/movies/", tags=["movies"]) def get_movie_by_category(category: str = Query(max_length=30, min_length=1)): result = [item for item in movies if item["category"] == category] return result[0] if result else {"error": "category does not exist in our database"} @app.post("/movies", tags=["movies"]) def create_movie(movie: Movie): movies.append(movie) return movies @app.put("/movies/{id}", tags=["movies"]) def update_movie(id: int, movie: Movie): updated_movies = (movie) if updated_movies != movies: movies[:] = updated_movies return movies else: return {"error": "id does not exist in our database"} @app.delete("/movies/{id}", tags=["movies"]) def delete_movie(id: int): deleted_movie = [item for item in movies if item["id"] != id] if deleted_movie != movies: movies[:] = deleted_movie return movies else: return {"error": "id does not exist in our database"} ```from fastapi import FastAPI, Body, Path, Queryfrom fastapi.responses import HTMLResponsefrom pydantic import BaseModel, Fieldfrom typing import Optional app = FastAPI()app.title = "My app with FastAPI"app.version = "0.0.1" class Movie(BaseModel):    id: Optional\[int] = None    title: str = Field(max\_length=30, min\_length=1)    overview: str = Field(max\_length=55, min\_length=1)    year: int = Field(le=2024)    rating: float = Field(ge=1, le=10)     category: str = Field(max\_length=30, min\_length=1)     class Config:        json\_schema\_extra = {                "example": {                    "id":3,                     "title":"My\_Movie\_Name",                     "overview":"My\_Movie\_Description\_or\_overview",                     "year":2024,                     "rating":10,                     "category":"My\_Movie\_Type"            }        } movies = \[    {   "id":1,         "title":"Avatar",         "overview":"On a lush planet called Pandora live the Na'vi, beings who...",         "year":2009,         "rating":7.8,         "category":"Action"    },    {   "id":2,         "title":"Titanic",         "overview":"Titanic, launched on May 31, 1911, and set sail on its maiden...",         "year":1997,         "rating":7.9,         "category":"Romantic/Adventure"    }] @app.get("/", tags=\["home"])def message():    return HTMLResponse("\

Hello world\

") @app.get("/movies", tags=\["movies"])def get\_movies():    return movies @app.get("/movies/{id}", tags=\["movies"])def get\_movie(id: int = Path(ge=1, le=2000)):    result = \[item for item in movies if item\["id"] == id]    return result\[0] if result else {"error": "id does not exist in our database"} @app.get("/movies/", tags=\["movies"])def get\_movie\_by\_category(category: str = Query(max\_length=30, min\_length=1)):    result = \[item for item in movies if item\["category"] == category]    return result\[0] if result else {"error": "category does not exist in our database"} @app.post("/movies", tags=\["movies"])def create\_movie(movie: Movie):    movies.append(movie)    return movies @app.put("/movies/{id}", tags=\["movies"])def update\_movie(id: int, movie: Movie):    updated\_movies = (movie)        if updated\_movies != movies:        movies\[:] = updated\_movies        return movies    else:        return {"error": "id does not exist in our database"} @app.delete("/movies/{id}", tags=\["movies"])def delete\_movie(id: int):    deleted\_movie = \[item for item in movies if item\["id"] != id]     if deleted\_movie != movies:        movies\[:] = deleted\_movie        return movies    else:        return {"error": "id does not exist in our database"}
```js class Movie(BaseModel): id: Optional[int] = None title: str = Field(max_length=30, min_length=1) overview: str = Field(max_length=55, min_length=1) year: int = Field(le=2024) rating: float = Field(ge=1, le=10) category: str = Field(max_length=30, min_length=1) class Config: json_schema_extra = { "example": { "id":3, "title":"My_Movie_Name", "overview":"My_Movie_Description_or_overview", "year":2024, "rating":10, "category":"My_Movie_Type" } } ```class Movie(BaseModel):    id: Optional\[int] = None    title: str = Field(max\_length=30, min\_length=1)    overview: str = Field(max\_length=55, min\_length=1)    year: int = Field(le=2024)    rating: float = Field(ge=1, le=10)     category: str = Field(max\_length=30, min\_length=1)     class Config:        json\_schema\_extra = {                "example": {                    "id":3,                     "title":"My\_Movie\_Name",                     "overview":"My\_Movie\_Description\_or\_overview",                     "year":2024,                     "rating":10,                     "category":"My\_Movie\_Type"            }        }
```js @app.get('/movies/{id}', tags=['Movies by Id']) def getMovieById(id: int = Path(ge = 1, le=2000)): for item in movies: if item["id"] == id: return item return [] @app.get('/movies/', tags=['Movies by category']) def getMovieByCategory(category: str = Query(min_length=5, max_length=15)): find_movies = [] for item in movies: if item["category"] == category: find_movies.append(item) return find_movies ```
No se porque a mi el example me sale desorneado si alguien me pu{ ` "category": "Accion"`, ` "id": 1`, ` "overview": "descripcion"`, ` "rating": 0`, ` "title": "Titulo"`, ` "year": 2022` `}````js { "category": "Accion", "id": 1, "overview": "descripcion", "rating": 0, "title": "Titulo", "year": 2022 } ```ede decir ![]()![]()