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


app . run ( )
然后像普通 Python 代码一样执行
$ python main.py 对于 FastAPI, 如果总是要用 uvicorn 来启动服务的话 , 在 IDE 中调用就变得不那么便利 。由于 uvicorn 本身就是 Python 实现 , 当然也就可以把命令过程写到 Python 代码中
from fastapi import FastAPIimport uvicornapp = FastAPI()if __name__ == "__main__":uvicorn.run(app) from fastapi import FastAPI
import uvicorn
app = FastAPI ( )
if __name__ == "__main__" :
uvicorn . run ( app )
注:uvicorn.run() 可接受更多的参数 , 相当于 uvicorn --help 可接受的 。
同样把 main.py 当作普通 Python 程序来启动即可
$ python main.py FastAPI 自动产生的 Web 文档前面讲过 , FastAPI 进入我的视野最首要的一个原因就是它集成了 Swagger UI, 在启动了 FastAPI 服务后 , 只要访问
http://localhost:8000/docs, 熟悉的 Swagger UI 即刻映入眼帘

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

文章插图
 
同时注意到函数映射为 API 的名称 , 由于参数是带有类型提示的 , 所以在 SwaggerUI 中也能看到相应的类型 。其他定制 Swagger UI 的工作需要时可细细研究 。
FastAPI 除了 SwaggerUI 外 , 还同时给了我们另一个选择 , 那就是 redoc, 访问
http://localhost:8000/redoc, 看到下面的界面
对比 Flask FastAPI - 一款新型的 Python Web 框架

文章插图
 
我也是头一回从 FastAPI 这里了解到还有一个 Redoc 的 Web API 文档工具 , 它和 SwaggerUI 类似 , 都是支持 Open API 。
API Spec 中包含请求/响应的 Model使用 FastAPI 时 , 在 API 文档中产生请求/响应的 Model 类型也很简单 , 下面的例子同时包含自定义的输入输出类型
下面是 main.py 的全新内容
from typing import Optionalfrom fastapi import FastAPIfrom pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: floatis_offer: Optional[bool] = Noneclass Msg(BaseModel):item_id: intitem_name: str@app.put("/items/{item_id}", response_model=Msg)def update_item(item_id: int, item: Item):return {"item_name": item.name, "item_id": item_id} from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI ( )
class Item ( BaseModel ) :
name : str
price : float
is_offer : Optional [ bool ] = None
class Msg ( BaseModel ) :
item_id : int
item_name : str
@ app . put ( "/items/{item_id}" , response_model = Msg )
def update_item ( item_id : int , item : Item ) :
return { "item_name" : item . name , "item_id" : item_id }
再查看
http://localhost:8000/docs 文档 , 看到 PUT /items/{item_id} 的界面如下
对比 Flask FastAPI - 一款新型的 Python Web 框架

文章插图
 
我们能看到请求与响应中的 Example Value 和 Schema 定义
梳理完 FastAPI 的自动 API 文档功能 , 进入下一个话题
FastAPI 的多文件支持FastAPI 类似于 Flask 的 Blueprints 功能没有一个特定的名称 , 只笼统的给出解决方案 Bigger Applications - Multiple Files . 我们来看一下它是怎么实现的 。这里简化官方的例子 , 排除了 dependencies 的应用 , 要用到的目录结构为
app├── internal│└── admin.py├── main.py└── routers├── items.py└── users.py app
├── internal
│ └── admin . py
├── main . py
└── routers
├── items . py
└── users . py
每个目录中都可以放一个 __init__.py 文件 , 标识为包 , 接着是每个文件的内容
app/internal/admin.py
from fastapi import APIRouterrouter = APIRouter()@router.get("/")def admin():return "admin" from fastapi import APIRouter
router = APIRouter ( )
@ router . get ( "/" )
def admin ( ) :
return "admin"
app/routers/items.py
from fastapi import APIRouterrouter = 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}


推荐阅读