本次调整后的目录如下:
我们可以使用APIRouter来声明路径操作,我们先看下如何去使用。
我们根据选择划分为users和items来细分。
具体实现如下:
①先看items实现
from fastapi import APIRouter
from fastapi import Depends
from models.crud import *item_router = APIRouter()
from . import create_db@item_router.post("/items/{uid}", response_model=ItemOut)
def create_item_by_user(uid: int, item: ItemModel, db: Session = Depends(create_db)):return create_item_by_user_method(db, uid, item)@item_router.get("/items", response_model=List[ItemOut])
def get_items(skip: int = 0, limit: int = 10, db: Session = Depends(create_db)):return get_items_method(db, skip, limit)@item_router.get("/items/{uid}", response_model=List[ItemOut])
def get_items_by_uid(uid: int, db: Session = Depends(create_db)):return get_items_by_uid_method(db, uid)
下面是users的实现方式
from fastapi import APIRouter
from fastapi import Depends
from models.crud import *user_router = APIRouter()
from . import create_db@user_router.post("/user", response_model=UserOut)
def create_user(user: UserModel, db: Session = Depends(create_db)):return create_user_method(db, user)@user_router.get("/user", response_model=UserOut)
def get_user(uid: int, db: Session = Depends(create_db)):return get_user_method(db, uid)
我们最后看下main文件
from fastapi import FastAPI
from routers.users import user_router
from routers.items import item_routerapp = FastAPI()
app.include_router(user_router)
app.include_router(item_router)if __name__ == '__main__':import uvicornuvicorn.run("main:app", reload=True)
其中,我们暂时把create_db方法提取到__init__.py中,否则会引起循环引用的错误,如下:
from models.database import SessionLocaldef create_db():"""每个请求处理完毕后关闭当前连接,不同的请求使用不同的链接"""db = SessionLocal()try:yield dbfinally:db.close()
重新启动我们的服务,测试下是否可以
我们的接口请求还是正确的,证明我们的改造是没有问题的。
如果想要给每一个路由都加一个通用的路径前缀标识,并且每个都有对应的tag,如下即可实现:
app.include_router(user_router, prefix="/u", tags=["users"])
app.include_router(item_router, prefix="/i", tags=["items"])
我们看下最后的接口是否增加了对应的前缀才可以访问
没有问题,根据我们的改造方式没有问题,那么tags如何看到效果呢?如下:
在复杂的应用上,我们可以根据不同模块,创建对应的路径操作。当然,我们在参数中还可以传递对应的依赖。
我们可以看下使用的方法,里面有很多参数,我们是可以传递的,具体的可以根据自己的需要进行传递。