FastAPI基础-路由和视图函数(三)

2023-05-07 20:50:22 浏览数 (2)

组合多个参数

在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(),该函数从请求头中获取身份验证令牌。

代码语言:javascript复制
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(),该函数创建并返回一个数据库连接。

代码语言:javascript复制
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响应。

0 人点赞