Saltar a contenido

Sesiones

En el apartado de middlewares se explicaba que estos intervienen en acciones que permiten interceptar y/o modificar el flujo de datos.

En esta entrada, nos enfocaremos en obtener toda la información de la sesión, utilizando la función session_info.

Disponible en el módulo app.common.middlewares.sessions

Nota

  • Te recomendamos leer, el apartado de Inyección de Dependencias.
  • Es necesario utilizar la dependencia (Depend) validate_auth_session, para que esta función funcione en un route.

session_info es una función utilizada como Inyección de Dependencias, para realizar las siguientes operaciones:

Definición

  • esta función valida que existan algunos campos comunes, en el objeto de la sesión(request.state).

  • obtiene los datos a validar, del objeto request.state para más información, consulta la función validate_auth_session en app.common.middlewares.auth.

  • inyecta en el route, un objeto con la información obtenida de la sesión ó None en caso de no estar presente el objeto de sesión.
1
2
3
4
5
6
7
8
from app.common.middlewares.sessions import session_info
...

async def customers_create(
    request: Request,
    session: Optional[object | Any] = Depends(session_info),
):
    ...

la función session_info buscará en el objeto request.state si existe una llave llamada session y verifica, si dentro de ella, existen las siguientes llaves:

1
2
3
4
5
6
7
8
9
- _id
- token_type
- access_token
- expire_token
- user
- role
- company
- permissions
- status

Nota

veamos un ejemplo:

agregamos la dependencia validate_auth_session:

1
2
3
4
5
6
7
# app/modules/customers/urls.py

from fastapi import Depends
from app.common.middlewares.auth import validate_auth_session
...

add_router(customers_router, "/customers", tags=["customers"], dependencies=[Depends(validate_auth_session)])

utilizamos session_info en un route:

# app/modules/customers/views/customers_view.py

from fastapi import APIRouter, Depends, Request
from app.common.middlewares.sessions import session_info
...

customers_router = APIRouter()

@customers_router.post("")
@customers_router.post("/")
async def customers_create(
    request: Request,
    body: CustomersCreateDto,
    session: Optional[object | Any] = Depends(session_info),
):
    try:
        ...

        logger.info("customers_create session info: {}", session)

        return response(201, HTTPStatus.CREATED, result)
    except Exception as e:
        logger.exception("customers_router.post customers_create Exception: {}", e)
        return response(400, HTTPStatus.UNEXPECTED_ERROR, error=str(e))

Recuerda

Recuerda utilizar la dependencia (Depend) validate_auth_session, para que funcione correctamente en un route, de lo contrario devolverá None.

Para tener en cuenta

Es posible que toque modificar esta función, cuando se utilice PostgreSQL y/o MySQL por la validación del campo _id.

Lectura recomendada