组合多个参数
在FastAPI中,我们可以使用路径参数、查询参数、请求体和请求头来组合多个参数。例如,我们可以使用路径参数来传递物品的ID,使用查询参数来过滤物品列表,使用请求体来创建新的物品,使用请求头来传递身份验证令牌。
代码语言:javascript复制@app.post("/items/{item_id}")
async def create_item(item_id: int, item: Item, token: str):
return {"item_id": item_id, **item.dict(), "token": token}
在上面的代码中,我们定义了一个路由/items/{item_id}
和一个视图函数create_item()
。当收到POST请求时,FastAPI将提取路径参数item_id
、请求体中的JSON数据并反序列化为Item
模型的实例、请求头中的Authorization
字段的值。然后,FastAPI将这些参数传递给视图函数create_item()
作为参数。视图函数返回一个JSON响应,
使用依赖注入
在FastAPI中,我们可以使用依赖注入来管理复杂的依赖关系和共享的状态。依赖注入是一种编程模式,其中依赖关系被声明为函数的参数,并由框架负责解析和提供。
声明依赖项
在FastAPI中,我们可以使用Depends
类来声明一个依赖项。例如,我们可以使用Depends
来声明一个依赖项get_token()
,该函数从请求头中获取身份验证令牌。
from fastapi import Depends
async def get_token(auth_header: str = Header(None)):
if auth_header is None:
raise HTTPException(status_code=401, detail="Authorization header missing")
scheme, token = auth_header.split()
if scheme.lower() != "bearer":
raise HTTPException(status_code=401, detail="Invalid authentication scheme")
return token
@app.get("/items/")
async def read_items(token: str = Depends(get_token)):
return {"token": token}
在上面的代码中,我们定义了一个依赖项get_token()
,它获取请求头中的Authorization
字段的值并验证身份验证方案。我们还定义了一个路由/items/
和一个视图函数read_items()
。当收到GET请求时,FastAPI将使用Depends
解析依赖项get_token()
,并将其返回值传递给视图函数read_items()
作为参数。如果依赖项无法解析或返回值无效,则FastAPI将引发HTTP异常。
声明复杂依赖项
在FastAPI中,我们可以使用Depends
来声明复杂的依赖项,例如依赖于其他依赖项的依赖项。例如,我们可以使用Depends
来声明一个依赖项get_db()
,该函数创建并返回一个数据库连接。
from fastapi import Depends, HTTPException
from sqlalchemy.orm import Session
from database import SessionLocal
def get_db():
try:
db = SessionLocal()
yield db
finally:
db.close()
@app.get("/items/")
async def read_items(db: Session = Depends(get_db)):
return db.query(Item).all()
在上面的代码中,我们定义了一个依赖项get_db()
,它创建并返回一个数据库连接。该函数使用Python的yield
语句来创建一个生成器,从而实现对数据库连接的延迟获取和自动释放。我们还定义了一个路由/items/
和一个视图函数read_items()
。当收到GET请求时,FastAPI将使用Depends
解析依赖项get_db()
,并将其返回值传递给视图函数read_items()
作为参数。该函数使用db
参数来执行数据库查询,并返回查询结果作为JSON响应。