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

Códigos de estado HTTP en FastAPI

14/37
Recursos

Aportes 12

Preguntas 0

Ordenar por:

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

Hola a todos, un aporte que quisiera realizar es que con este código ustedes pueden acceder a los enumeradores de los códigos de estado de una forma más sencilla y legible: ```js from fastapi import FastApi, Path, Query, status @app.get('/movies', tags=["movies"], response_model=List[Movie]) def get_movies() -> JSONResponse: return JSONResponse(content=movies, status_code=status.HTTP_200_OK) ```Es decir: podemos acceder a todos los métodos HTTP que vimos en la clase con un código legible a largo plazo. HTTP\_(código\_del\_status)\_(lo que devolverá ese status) **Ejemplo**: HTTP\_404\_NOT\_FOUND
![](https://raw.githubusercontent.com/Yrrrrrf/tcp_server/main/resources/img/http_status_codes.png)
Para la solución del reto es mas óptimo mandar la excepción de manera automática por medio de la libreria HTTPException quedando la petición en este caso put asi ` raise HTTPException(status_code=404, detail="Movie not found") `
Para la solución del reto es mas óptimo mandar la excepción de manera automática por medio de la libreria HTTPException quedando la petición en este caso put así `@app.put("/movies/create", tags=["movies"], response_model=dict) ` `def update_movie(id: int , updated_movie: Movie)-> dict:    ` `for index, movie in enumerate(movies_data):        ` `if movie["id"] == id:           ` ` movies_data[index] = updated_movie.dict()            ` `return JSONResponse(content={"message": f"La película {updated_movie.title} ha sido actualizada", "movies": movies_data})` `    raise HTTPException(status_code=404, detail="Movie not found") `

Hice esto con el delete, GPT me ayudó pasando todo el código hasta ahora del curso, pero me dió sugerencia respecto a otra función, una get, pero quise venir e implementarla en delete porque me hizo sentido primero que el get.

@app.delete('/movies/{id}', tags=['movies'], response_model=dict, status_code=200)
def delete_movie(id: int) -> dict:
    for movie in movies:
        if movie["id"] == id:
            movies.remove(movie)
            return JSONResponse(status_code=200, content={"mesage": "Se ha eliminado la película"})
    raise HTTPException(status_code=404, detail={"error": f"Registro con id = {id} no encontrado en la base de datos"})
Solución: ```js @app.get('/movies/{id}', tags=['movies']) def get_movie(id: int): for item in movies: if item["id"] == id: return item raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="No se encontró la película") ```
En el curso de backend me proporcionaron este recurso, la verdad me ayudo a entender mas los códigos de estado: <https://http.cat/>
```js @app.get('/movies/{id}', tags=['Movies by Id'], response_model=Movie, status_code=200) def getMovieById(id: int = Path(ge = 1, le=2000)): for item in movies: if item["id"] == id: return JSONResponse(content=movies, status_code= 200) return JSONResponse(content=["Resoruce not found"],status_code = 404) ```
```js @app.get("/movies/{id}", tags = ["movies"], response_model = Movie) def get_movie(id: int = Path(ge=1, le=2000)) -> Movie: for item in movies: if item["id"] == id: return JSONResponse(content=item) return JSONResponse(content=["El id no existe"],status_code = 404) ```@app.get("/movies/{id}", tags = \["movies"], response\_model = Movie)def get\_movie(id: int = Path(ge=1, le=2000)) -> Movie:    for item in movies:        if item\["id"] == id:            return JSONResponse(content=item)            return JSONResponse(content=\["El id no existe"],status\_code = 404)
Hola, Como podemos documentar el código 404? ![](https://static.platzi.com/media/user_upload/Screenshot%202024-01-11%20at%2015.58.03-46c26e4b-2383-4dd3-b654-20af1aacfb18.jpg)
![]()
Tengo un problema y es que a mi me gusta devolver siempre clases genericas o con propiedades para dar informacion a quien usa las api, quiero usar la siguiente clase que dentro de data intente colocar una propiedad generica como T para que reciba cualqueir tipo de objeto, por ahora lo intente asi como lo envio menos complicado pero no me funciono y es porque da problema al serializar el objeto, alguna idea? para lograrlo?# Definicion de la clase respuestaclass Response(BaseModel):    data: Optional\[List\[Movie]] = None    origin: Optional\[str]    isSuccess: bool = False    isConflict: bool = False    hasAttached: bool = False    message: Optional\[str]    details: Optional\[str]    errors = [email protected]('/movies', tags=\['movies'], status\_code=200)def get\_movies():     # Valida si contiene datos    if movies:        response = Response()        response.data = movies        return JSONResponse(status\_code=status.HTTP\_200\_OK, content=response)     # Devolvemos la lista completa de películas en formato JSON    return JSONResponse(status\_code=status.HTTP\_200\_OK, content={}) ```js # Definicion de la clase respuesta class Response(BaseModel): data: Optional[List[Movie]] = None origin: Optional[str] isSuccess: bool = False isConflict: bool = False hasAttached: bool = False message: Optional[str] details: Optional[str] errors = str ``````js @app.get('/movies', tags=['movies'], status_code=200) def get_movies(): # Valida si contiene datos if movies: response = Response() response.data = movies return JSONResponse(status_code=status.HTTP_200_OK, content=response) # Devolvemos la lista completa de películas en formato JSON return JSONResponse(status_code=status.HTTP_200_OK, content={}) ```ERROR: ```js TypeError: Object of type Response is not JSON serializable ```TypeError: Object of type Response is not JSON serializable