python3的模块FastAPI,APIRouter

发布时间 2023-10-13 18:11:30作者: 凯-子

FastAPI 将依赖项的值从include_router传递给路由 FastAPI

依赖项和include_router

在FastAPI中,依赖项是一种重要的机制,用于处理从请求到响应的整个过程中所需的各种依赖关系,例如数据库连接、身份验证等。依赖项可以被注入到请求处理函数中,并在执行时提供所需的值。在FastAPI中,我们可以使用Depends装饰器来定义这些依赖项。

include_router函数是FastAPI中的一种方式,用于将子路由包含到主路由中。通过include_router,我们可以将不同的路由分组,并在需要时将它们添加到主路由中。

实例1:

import uvicorn
from fastapi import FastAPI,APIRouter

router = APIRouter()
#router = APIRouter(prefix='/add')   ###prefix定义在router中
app = FastAPI()

# 绑定路由和视图函数
@app.get("/")
def index():
    return {"msg": "fastapi测试成功"}

# 异步 后面基本会用异步 速度快
@router.get("/numbers")
async def A():
    return {"msg": "we are adding numbers"}

# 同步
@router.get("/strings")
def B():
    return {"msg": "we are adding strings"}

### 动态路径 和 Flask 不同,Flask 是使用 <>,而 FastAPI 使用 {}
@router.get("/{item_id}")
def C(item_id):
    return {"msg": "we are adding {}".format({item_id})}

app.include_router(router,prefix='/add')
#app.include_router(router)     ###prefix定义在router中

if __name__ == "__main__":
    uvicorn.run(app,host="0.0.0.0",port=8000)
View Code

 

在include_router中传递依赖项的值给路由

在某些情况下,我们可能需要在include_router中访问依赖项的值,并将它们传递给子路由中的请求处理函数。为了实现这一点,我们可以使用Dependency类来注入依赖项的值,并将它们作为参数传递给请求处理函数。

实例2:

from fastapi import FastAPI,APIRouter,Depends

router = APIRouter()
app = FastAPI()

async def get_current_user():
    # 获取当前用户的逻辑
    return {"username": "Alice"}

async def get_db_connection():
    # 获取数据库连接的逻辑
    return "database_connection"

# 异步 后面基本会用异步 速度快
@router.get("/users")
async def A(current_user: dict = Depends(get_current_user)):
    return current_user

### 动态路径 和 Flask 不同,Flask 是使用 <>,而 FastAPI 使用 {}
@router.get("/{item_id}")
async def C(item_id: int, db_connection: str = Depends(get_db_connection)):
    return {"item_id": item_id, "db_connection": db_connection}

app.include_router(router,prefix='/add', dependencies=[Depends(get_current_user), Depends(get_db_connection)])

if __name__ == "__main__":
    uvicorn.run(app,host="0.0.0.0",port=8000)
View Code

 

在上面的示例中,定义了两个依赖项函数get_current_userget_db_connection。它们分别返回当前用户的信息和数据库连接。然后,我们使用APIRouter创建一个路由器,并在该路由器中定义了两个路由,分别处理/users/me/users/{user_id}的请求。

在include_router函数中,我们将这两个依赖项函数作为dependencies参数传递给了该函数。这样,在子路由中的请求处理函数中,我们就可以直接使用这两个依赖项的值了。

例如,通过访问/users/me路由,我们可以获得当前用户的信息。而通过访问/users/{user_id}路由,我们可以获得指定用户ID的信息以及数据库连接。

这样,我们就成功地将依赖项的值从include_router传递给了路由。