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

JSONResponse: Tipos de respuestas en FastAPI

13/37
Recursos

Aportes 4

Preguntas 0

Ordenar por:

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

Hay un error cuando se quiere obtener todas las peliculas (get\_movies) luego de hacer el *post* de una nueva pelicula (create\_movie). El error que se obtiene es el siguiente: `TypeError: Object of type method is not JSON serializable` Esto se debe a que cuando se realiza el *post* se añade un nuevo elemento a `movies` de tipo `Movie`, el cual no se puede serializar como JSON debido a que `movies` es una lista de diccionarios. Para solucionar ello, se debe modificar lo que se agrega a la lista de películas. En la función `create_movie()`, modficar lo siguiente: `movies.append(movie.model_dump())` Con ello se soluciona el problema.
```js @app.post('/movies', tags=['Movies']) # def create_movie(title: str = Body(), overview: str = Body(), year: int = Body(), rating: float = Body(), category: str = Body()): def create_movie(movie: Movie): # Verifica si l apalícula existe por ID if any(m['id'] == movie.id for m in movies): raise HTTPException(status_code=400, detail="Pelicula ya existe") movie_dic = movie.model_dump() movies.append(movie_dic) data = [m for m in movies if m['id']==movie.id] return JSONResponse(content={"message": "Se ha creado la palícula", "data":data }, status_code=201) @app.put('/movie/{id}', tags=['Movies']) def update_movie(id: int, movie: Movie): update_movie = next((item for item in movies if item['id'] == id), None) if update_movie: update_movie["title"] = movie.title update_movie["overview"] = movie.overview update_movie["year"] = movie.year update_movie["rating"] = movie.rating update_movie["category"] = movie.category data = [] if update_movie is None else update_movie return JSONResponse(content={"message": "Se ha creado la palícula", "data": data}, status_code=200) ```@app.post('/movies', tags=\['Movies'])# def create\_movie(title: str = Body(),  overview: str = Body(), year: int = Body(), rating: float = Body(), category: str = Body()):def create\_movie(movie: Movie):    # Verifica si l apalícula existe por ID    if any(m\['id'] == movie.id for m in movies):        raise HTTPException(status\_code=400, detail="Pelicula ya existe")    movie\_dic = movie.model\_dump()    movies.append(movie\_dic)    data = \[m for m in movies if m\['id']==movie.id]    return JSONResponse(content={"message": "Se ha creado la palícula", "data":data }, status\_code=201) @app.put('/movie/{id}', tags=\['Movies'])def update\_movie(id: int, movie: Movie):    update\_movie = next((item for item in movies if item\['id'] == id), None)    if update\_movie:        update\_movie\["title"]  = movie.title        update\_movie\["overview"] = movie.overview        update\_movie\["year"] = movie.year        update\_movie\["rating"] = movie.rating        update\_movie\["category"] = movie.category    data = \[] if update\_movie is None else update\_movie       return JSONResponse(content={"message": "Se ha creado la palícula", "data": data}, status\_code=200)
Hola, estoy utilizando Pycharm como editor de codigo, tambien tengo un poco de experiencia desarrollando software. Hay una incongruencia en como manejas las funciones, le estas indicando a python que devolvera un tipo: List\[Movie] pero en realidad esta devolviendo un: JSONObject(content=List\[Movie]) Son diferente tipo de datos, soy nuevo en python pero me parece extranio, tiene algun comportamiento interno que no sepamos? Si no seria mejor dejar la funcion de manera implicita sin indicar que tipo de dato devolveria, o quiza el JSONResponse esta sobrando, no se, deberias explicar un poco mejor esto
En el método **put** el error fue el siguiente `TypeError: 'Movie' object is not subscriptable` y leyendo un poco esto ocurre porque estamos tratando de acceder a la propiedad de un diccionario de la forma `movie["id"]` sin embargo, no le estamos indicando en la clase que actue como tal, para ello una solución que me funcionó es la siguiente. Agregar el siguiente método dentro de la clase: ```python def model_dump(self): return { "id": self.id, "title": self.title, "overview": self.overview, "year": self.year, "rating": self.rating, "category": self.category } ``` Y así de esta forma ya le estamos indicando que acceda a los atributos de la forma especificada `movie["id"]`