zoukankan      html  css  js  c++  java
  • FastAPI 学习之路(三十六)引入APIRouter

     我们可以使用APIRouter来声明路径操作,我们先看下如何简单的去使用。

    from fastapi import APIRouter
    
    router=APIRouter()
    app = FastAPI()
    # 新建用户
    @router.post("/users/", tags=["users"], response_model=Users)
    def create_user(user: UserCreate, db: Session = Depends(get_db)):
        db_crest = get_user_emai(db, user.email)
        if not db_crest:
            return db_create_user(db=db, user=user)
        raise HTTPException(status_code=200, detail="账号不能重复")
    app.include_router(router)


            基于前面的代码演示的,其实改造很简单,我们引入对应类即可,然后在对应的接口上使用,最后在我们的app实例化类上注册这个路径操作,修改后我们看下实际的效果,检验我们实际的效果。

          依然是实现了,我们之前的需求。那么我们接下来按照不一样的模块进行划分,最后都归纳到routers目录。

            我们根据选择划分user和items来细分。

            那么看下items目录怎么实现的

    from fastapi import APIRouter
    from fastapi import  Depends
    from models.crud import *
    from models.database import *
    itemsRouter=APIRouter()
    
    def get_db():
        """
        每一个请求处理完毕后会关闭当前连接,不同的请求使用不同的连接
        :return:
        """
        db = SessionLocal()
        try:
            yield db
        finally:
            db.close()
    # 所有item
    @itemsRouter.get("/items/", response_model=List[Items])
    def read_items(skip: int = 0, limit: int = 0, db: Session = Depends(get_db)):
        items = get_item(db=db, skip=skip, limit=limit)
        return items

      下面是user文件如何实现的

    from fastapi import APIRouter
    from fastapi import  Depends,HTTPException
    from models.crud import *
    from models.database import *
    usersRouter=APIRouter()
    
    def get_db():
        """
        每一个请求处理完毕后会关闭当前连接,不同的请求使用不同的连接
        :return:
        """
        db = SessionLocal()
        try:
            yield db
        finally:
            db.close()
    
    # 新建用户
    @usersRouter.post("/users/", tags=["users"], response_model=Users)
    def create_user(user: UserCreate, db: Session = Depends(get_db)):
        db_crest = get_user_emai(db, user.email)
        if not db_crest:
            return db_create_user(db=db, user=user)
        raise HTTPException(status_code=200, detail="账号不能重复")
    
    
    @usersRouter.post("/user/item/{user_id}", response_model=List[Items])
    def get_user_items(user_id: int, db: Session = Depends(get_db)):
        return get_user_item(db=db, userid=user_id)
    
    
    # 通过id查询用户
    @usersRouter.get("/user/{user_id}", response_model=Users)
    def read_user(user_id: int, db: Session = Depends(get_db)):
        db_user = get_user(db, user_id=user_id)
        if not db_user:
            raise HTTPException(status_code=404, detail="用户查找不到")
        return db_user
    
    
    # 创建用户的item
    @usersRouter.post("/users/{user_id}/items", response_model=Items)
    def create_item_user(user_id: int, item: ItemCreate, db: Session = Depends(get_db)):
        return create_user_item(db=db, item=item, user_id=user_id)

      那么我们看下最后的main文件

    from fastapi import FastAPI
    from routers.user import usersRouter
    from routers.items import itemsRouter
    
    app = FastAPI()
    app.include_router(usersRouter)
    app.include_router(itemsRouter)

    我们正常去启动下

    uvicorn main:app --reload

      我们看下最后的接口请求

     我们的接口请求还是正确的。证明我们的改造是没有问题的。我们看下最后的目录

     这就是我们最后的目录。

            我们想要给每一个路由都增加一个通用的路径前缀,并且每个都有对应的tag,我们应该如何实现呢,其实答案很简单

            

    app.include_router(usersRouter,prefix="/user",tags=['users'])
    app.include_router(itemsRouter,prefix="/items",tags=['Itmes'])

    我们看下最后的接口是否增加了对应的,我们看下接口的请求

     

      我们可以看到两个模块的接口都改造完毕,但是我们说的tag,如何可以看到具体的效果呢,我们可以看下http://localhost:8000/docs的接口文档。

       在复杂的应用上,我们可以根据不同模块,创建对应的路径操作。当然,我们在参数中还可以传递对应的依赖。

    我们可以看下使用的方法,里面有很多参数,我们是可以传递的,具体的可以根据自己的需要进行传递。

    文章首发在公众号,欢迎关注。

  • 相关阅读:
    LeetCode 654. 最大二叉树
    LeetCode 617. 合并二叉树
    LeetCode 234. 回文链表
    LeetCode 328. 奇偶链表
    LeetCode 24. 两两交换链表中的节点
    LeetCode 21. 合并两个有序链表
    LeetCode 876. 链表的中间结点
    顺序表的定义及其相关基本操作
    LeetCode 206. 反转链表
    LeetCode 111. 二叉树的最小深度
  • 原文地址:https://www.cnblogs.com/leiziv5/p/15416805.html
Copyright © 2011-2022 走看看