对比 Flask FastAPI - 一款新型的 Python Web 框架( 三 )

from fastapi import APIRouter
router = APIRouter ( prefix = "/items" , tags = [ "tag_items" ] )
@ router . get ( "/" )
async def read_items ( ) :
return { "__all__" }
@ router . delete ( "/{item_id}" )
def delete_item ( item_id : int ) :
return { "action" : "delete" , "item_id" : item_id }
app/routers/users.py
from fastapi import APIRouterrouter = APIRouter()@router.get("/users/{username}", tags=["users"])def read_user(username: str):return {"username": username}@router.post("/users/{username}", tags=["users"])async def add_user(username: str):return {"action": "add", "username": username, "userid": "new_id"} from fastapi import APIRouter
router = APIRouter ( )
@ router . get ( "/users/{username}" , tags = [ "users" ] )
def read_user ( username : str ) :
return { "username" : username }
@ router . post ( "/users/{username}" , tags = [ "users" ] )
async def add_user ( username : str ) :
return { "action" : "add" , "username" : username , "userid" : "new_id" }
在每个单独定义路由的文件里用到的是 APIRouter , 它相当是一个迷你的 FastAPI , 也类似于 Flask 的 Blueprint . 上面分别演示了两种 APIRouter 的声明方式 , 声明时带不带 prefix 和 tags 。同时在为函数定义路由时也可指定 tags , 在后面我们将会注意到 tags 只是为 API 文档分类用的 。
app/main.py
from fastapi import FastAPIfrom .internal import adminfrom .routers import users, itemsapp = FastAPI()app.include_router(users.router)app.include_router(items.router)app.include_router(admin.router, prefix="/admin", tags=["admin"])@app.get("/")def index():return "index" from fastapi import FastAPI
from . internal import admin
from . routers import users , items
app = FastAPI ( )
app . include_router ( users . router )
app . include_router ( items . router )
app . include_router ( admin . router , prefix = "/admin" , tags = [ "admin" ] )
@ app . get ( "/" )
def index ( ) :
return "index"
这里实际上使用了三种定义路径前缀与 tags(API 分类) 的方式

  1. user.router: 在每个 API 中定义完整 API 路径(如 /users 为 URL 前缀) 以及 tags
  2. item.router: 声明 APIRouter 时统一指定 URL 前缀和 tags
  3. admin.router: 注册 APIrouter 到 app(FastAPI) 时指定 URL 前缀和 tags
现在运行
$ uvicorn app.main:app --reload 查看 SwaggerUI
http://localhost:8000/docs
对比 Flask FastAPI - 一款新型的 Python Web 框架

文章插图
 
到目前为止我重点关注 FastAPI 的就是以上那两个特性:自动 API 文档与大程序多文件(Blueprint) 功能 。其他的特性可查阅 FastAPI 的 Features。比如:
  1. 自动的 JSON 反序列化
  2. 数据校验功能
  3. HTTP Basic, OAuth2, API keys 的支持
  4. WebSocket, 进程内后台任务 , 启动/关闭事件 , CORS, GZIP, 静态文件 , 流响应数据 , Session/Cookie
  5. 轻松与 GraphQL 集成


推荐阅读