文档处理程序和错误
依赖和守卫
跨具有 FastAPI 依赖项的路由共享身份验证、数据库会话和其他设置。它们在两个级别上工作,目录级别像布局一样继承。
| 级别 | 其中 | 适用于 |
|---|---|---|
| 目录 | dependencies.py |
目录及以下的每条路线,页面包括 |
| 处理程序 | Depends、@UseGuard、@Middleware |
一个处理程序 |
每个目录:dependencies.py
dependencies.py 声明一个 dependencies 普通函数列表。 Nexy 将每一项都包装在 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]src/routes/admin/ 下的每个路由现在都需要标头、.py 处理程序和 .nexy 页面。
继承
依赖关系从路由根目录收集到路由目录,最外层第一个,与布局完全相同,并且处理程序自己的守卫最后运行:
src/routes/
dependencies.py1. root
admin/
dependencies.py2. admin
users/
dependencies.py3. users
index.py4. handler guards, then the handler
对于 GET /admin/users,顺序是 root、admin、users、处理程序的 @UseGuard 函数、其 @Middleware 函数,然后是处理程序。路由组 ((group)/) 是一个与其他目录一样的目录,因此它的 dependencies.py 也参与其中。
每个处理程序
在签名中使用 Depends,就像在任何 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}处理程序上的警卫和中间件
@UseGuard 和 @Middleware 将 FastAPI 依赖项附加到处理程序而不更改其签名。两者都是依赖项,而不是 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}对于真正的 ASGI 中间件(CORS、GZip、会话、您自己的),请使用 中间件和安全性 中的 useMiddlewares 和 use* 选项。
依赖失败
依赖项通过引发来拒绝请求。 HTTPException 以您提出的状态作为 API 客户端 (Accept: application/json) 的 JSON 和浏览器的错误页面进行回答。请参阅验证和错误。