Status Code personalizados

4/25
Recursos

Aportes 26

Preguntas 4

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Status code con gatos:

https://http.cat/

los statuso code o codigos de estado son respuestas http los cuales indican el el estado de finalizacion de una solicitud especifica:

Aporte - Status Code din谩mico

En el c贸digo de los endpoints (Path operation functions), es muy com煤n tener l贸gica para retornar distintos status codes.

Les comparto un ejemplo de c贸mo realizarlo.

Ejemplo

# FastAPI
from fastapi import FastAPI
from fastapi import Path
from fastapi import Response  # Import this
from fastapi import status

app = FastAPI()

@app.get('/{id}')
def default(
    id: int = Path(...,
                   gt=0,
                   description='The item unique identifier',
                   title='The item unique identifier',
                   example=1),
    response: Response = Response(status_code=status.HTTP_200_OK)  # Add the response object reference
):
    if id > 10:
        response.status_code = status.HTTP_404_NOT_FOUND  # Change the status code as you want
        return {'detail': 'Item not found'}
    
    return {'id': id}

No estoy muy seguro,
pero utlice el codigo 200 (ok) y 202 (acepted) :

@app.get(
    path = "/person/detail/{person_id}",
    status_code = status.HTTP_200_OK
    )

@app.put(
    path = "/person/{person_id}",
    status_code = HTTP_202_ACCEPTED
    )

![](

Podr谩s seguir todos mis apuntes escritos en Notion en:
https://rain-scabiosa-74f.notion.site/Curso-de-FastAPI-Avanzado-189668eeee1a45168e46c5be56312967
Si te gusta dejame un corazoncito 鈾

Para a帽adir los status code dentro de FastAPI funciona muy similar a a帽adir un Response Model en el Path Operation Decoractor usando el parametro status_code

@app.get(
    path='/',
    status_code=status.HTTP_200_OK
)
def home():
    return {'hello': 'world'}

@app.post(
    path='/person/new',
    response_model=PersonOut,
    status_code=status.HTTP_201_CREATED
)
def create_person(person: Person = Body(...)):
    """
    Rescata mi documentacion mardita pvta
    """
    return person

HTTP STATUS CODES

Status code con gatos:
https://http.cat/

1脳脳 Informational

2脳脳 Success

3脳脳 Redirection

4脳脳 Client Error

5脳脳 Server Error

Algunos tipos de status code especiales:

201: Algo se creo (created), por ejemplo si estamos en una path operation desde el cliente al servidor, que envia una petici贸n de tipo post y en esa petici贸n creamos un usuario y guardamos el usuario en la base de datos, el servidor responde 201.
204: No content. Es decir que no hay ninguna respuesta, aunque todo haya salido bien.
404: Accedimos a un endpoint que no existe. (No exists)
422: Validation error. Es decir que el cliente nos envia un dato que no esta en el formato que esper谩bamos. Por ejemplo si esper谩bamos un validation de no mas de 20 caracteres y le llega al server de 21 caracteres.

PUT: Si se modifica un recurso existente, DEBER脥AN enviarse los c贸digos de respuesta 200 (OK) o 204 (Sin contenido) para indicar que la solicitud se complet贸 con 茅xito.

**DELETE: ** Una respuesta exitosa DEBE ser 200 (OK) si la respuesta incluye una entidad que describe el estado, 202 (Aceptada) si la acci贸n a煤n no se ha promulgado, o 204 (Sin contenido) si la acci贸n se ha promulgado pero la respuesta no incluye una entidad.

Estuve buscando cu谩les son las convenciones de los status code para cada una de las operaciones de un CRUD, y este link trae buena informaci贸n!

Desafio: Colocar el status code de las faltantes

@app.get(
    path="/person/detail/{person_id}",
    status_code=status.HTTP_200_OK
    )

@app.put(
    path="/person/{person_id}",
    status_code=status.HTTP_200_OK
    )

Los stauts code que yo puse

@app.get('/person/detail', status_code=status.HTTP_200_OK)
@app.get('/person/detail/{person_id}', status_code=status.HTTP_200_OK)
@app.put("/person/{person_id}", status_code=status.HTTP_200_OK)

Status Code

No es necesario importar status de fastapi bastar谩 con colocar el numero del codigo http. Ejemplo

@app.post(
    "/users/new",
    response_model=Person,
    response_model_exclude={"password"},
    status_code=201,
)
async def create_user(person: Person = Body(...)):
    return person
@app.get(
    path="/",
    status_code=status.HTTP_200_OK
    )
def home():
    return {"Hello": "World"}

#request and response body

@app.post(
    path="/person/new", 
    response_model=PersonOut,
    status_code=status.HTTP_201_CREATED
    )
def create_person(person: Person = Body(...)):
    return person

#validaciones query parameters
#validations Querys: max_length,min_length, regex, ge ,le ,gt,lt

@app.get(
    path="/person/detail",
    status_code=status.HTTP_200_OK
    )
def show_person(
    name: Optional[str] = Query(
        None,
        min_length=1,
        max_length=50,
        title="Person Name",
        description="This is the person name. It between 1 and 50 characters",
        example="Andrea"
        ),
    age: int = Query(
        ...,
        title="Person Age",
        description="This is the person age. It's requiered",
        example=20
        )
):
    return {name: age}

#validaciones path parameters

@app.get(
    path="/person/detail/{person_id}",
    status_code=status.HTTP_202_ACCEPTED
    )
def show_person(
    person_id: int = Path(
        ..., 
        gt=0,
        title="Person ID",
        description="This is a person ID. It's requiered",
        example=222
        )
):
    return {person_id: "It exist!"}

#Validaciones: Request body

@app.put(
    path="/person/{person_id}",
    status_code=status.HTTP_202_ACCEPTED
    )
def update_person(
    person_id: int = Path(
        ...,
        title="Person ID",
        description="This is the person ID",
        gt=0,
        example=111
    ),
    person: Person = Body(...),
    location: Location =Body(...)
):
    results = person.dict()
    results.update(location.dict())
    return results
    #return person

HTTP status code for update and delete?
Para el path operation con el method Update (PUT) se deber铆a retornar los status 200 o 204, con la salvedad de que en el status 204 el servidor no esta retornando nada.

El c贸digo 204 es usado cuando eliminar un elemento es decir una operaci贸n DELETE.

Busqu茅 en internet cual status code se deber铆a usar para PUT y al parecer es el 204.

@app.get(
    path = "/",
    status_code = status.HTTP_200_OK
    ) #path operation decorator
def home(): #path operation function
    return {"message": "Hello World, I'm using Python and FastAPI 馃悕"}


# Request and Response Body

@app.post(
    path = "/person/new",
    response_model = PersonOut,
    status_code = status.HTTP_201_CREATED
    )
def create_person(person: Person = Body(...)): # Los '...' indican que es obligatorio
    return person


# Validaciones: Query Parameters

@app.get(
    path = "/person/detail",
    status_code = status.HTTP_200_OK
    )
def show_person(
    name: Optional[str] = Query(
        None,
        min_length=1,
        max_length=50,
        title="Person name.",
        description="This is the person name. It's between 1 and 50 characters.",
        example="Miguel"
        ),
    age: int = Query(
        ...,
        title="Person age",
        description="This is the person age. It's required",
        gt=0,
        example=23
        )
):
    return {"name": name, "age": age}


# Validaciones: Path Parameters

@app.get(
    path = "/person/detail/{person_id}",
    status_code = status.HTTP_200_OK
    )
def show_person(
    person_id: int = Path(
        ...,
        gt=0,
        title="Person ID.",
        description="This is the person ID. It's required and must be greater than 0.",
        example=123
    )
):
    return {"person_id": person_id}


# Validations: Request Body

@app.put(
    path = "/person/{person_id}",
    status_code = status.HTTP_204_NO_CONTENT
    )
def update_person(
    person_id: int = Path(
        ...,
        title="Person ID.",
        description="This is the person ID.",
        gt=0,
        example=123
    ),
    person: Person = Body(...),
    location: Location = Body(...),
):
    return {
        "person_id": person_id,
        "person:": person,
        "location": location,
    }

Para la petici贸n PUT tuve dudas y encontr茅 esta pregunta en stack, con ese aporte me base en el ejercicio.
https://stackoverflow.com/questions/2342579/http-status-code-for-update-and-delete

# Validaciones: Path parameters
@app.get(
    path="/person/detail/{person_id}",
    status_code=status.HTTP_200_OK)

# Validaciones: Request Body
@app.put(
    path="/person/{person_id}",
    status_code=status.HTTP_204_NO_CONTENT)

Si 鈥渟tatus鈥 no les muestra sus opciones de respuesta en VSCode simplemente deben instalar la extensi贸n 鈥淧ylance鈥

Para establecer un c贸digo de respuesta, en el Path operation decorator se usa el par谩metro status_code seguido del c贸digo de estado de respuesta HTTP.

Ejemplos:

@app.get(
    path='/',
    status_code=status.HTTP_200_OK
    )

@app.post(
    path='/person/new',
    response_model=PersonOut,
    status_code=status.HTTP_201_CREATED
    )

@app.get(
    path='/person/detail/{person_id}',
    status_code=200
    )

@app.put(
    path='/person/{person_id}',
    status_code=status.HTTP_200_OK
    )

Reto:

@app.get(
    path="/person/detail/{person_id}",
    status_code=status.HTTP_200_OK
    )
...
@app.put(
    path="/person/{person_id}",
    status_code=status.HTTP_204_NO_CONTENT
    )

Al ingresar el numero del status code directamente sin importar el status desde fastAPI por ejemplo:

status_code=200

El path operation decorator lo toma sin error:

Yo utilic茅 para el m茅todo GET siempre el c贸digo 200. Para el PUT utilic茅 un 201 al igual que en POST, sin embargo podr铆amos usar tambi茅n el 202 (Accepted)

Cada Path Operations que creemos debe tener un status code personalizado. Para hacer lo necesitamos importar el m贸dulo status desde FastAPI. Los estatus code se deben declarar en el decorador.

from fastapi import status
@app.get(
        path="/", 
        status_code=status.HTTP_200_OK
        )
def home(): 
    return {"Hello": "World"}

100 - 199 Information
200 - 299 OK
300 - 399 Redirection
400 - 499 Client Error
500 - 599 Internal Server Error

Gu铆a de Status Codes

Us茅 el status 200 [HTTP_OK] para las 2 versiones de la funci贸n 鈥渟how_person鈥 y la funci贸n 鈥渦pdate_person鈥, ya que en todas su labor principal es la consulta de datos.