DocsControladores y errores
Dependencias y guardias
Comparta autenticación, sesiones de bases de datos y otras configuraciones a través de rutas con FastAPI dependencias. Funcionan en dos niveles y el nivel del directorio se hereda como los diseños.
| Nivel | Donde | Se aplica a |
|---|---|---|
| Directorio | dependencies.py |
todas las rutas en el directorio y debajo, páginas incluidas |
| Controlador | Depends, @UseGuard, @Middleware |
un controlador |
Por directorio: dependencies.py
Un dependencies.py declara una dependencies lista de funciones simples. Nexy envuelve cada uno en Depends.
from nexy.http import Header, HTTPException def require_admin(x_role: str = Header(...)) -> None: if x_role != "admin": raise HTTPException(status_code=403, detail="Admins only") dependencies = [require_admin]Cada ruta bajo src/routes/admin/ ahora requiere el encabezado, los controladores .py y las páginas .nexy por igual.
herencia
Las dependencias se recopilan desde la raíz de las rutas hasta el directorio de la ruta, la más externa primero, exactamente igual que los diseños, y las propias guardias del controlador se ejecutan al final:
Para GET /admin/users el orden es root, admin, users, las funciones @UseGuard del controlador, sus funciones @Middleware y luego el controlador. Un grupo de rutas ((group)/) es un directorio como cualquier otro, por lo que su dependencies.py interviene.
Por manejador
Utilice Depends en la firma, como en cualquier aplicación FastAPI:
from nexy.http import Depends, Header, HTTPException def current_user(authorization: str = Header(...)) -> str: if authorization != "Bearer secret": raise HTTPException(status_code=401, detail="Unauthorized") return "ada" async def GET(user: str = Depends(current_user)): return {"user": user}Guardias y middleware en un controlador
@UseGuard y @Middleware adjuntan FastAPI dependencias a un controlador sin cambiar su firma. Ambas son dependencias, no middleware ASGI:
from nexy.decorators import Middleware, UseGuard def audit() -> None: ... def must_be_staff(x_staff: str = Header(...)) -> None: ... @UseGuard(must_be_staff)@Middleware(audit)async def GET(): return {"ok": True}Para middleware ASGI real (CORS, GZip, sesiones, el suyo propio) utilice las opciones useMiddlewares y use* en Middleware y seguridad.
Fallar una dependencia
Una dependencia rechaza una solicitud planteando. HTTPException responde con el estado que planteaste, como JSON para clientes API (Accept: application/json) y como página de error para navegadores. Ver Validación y errores.