(2022.10.30 Sun)
FastAPI是基于Python3.7或更高版本的、带有Python标准类型提示(type hints)的、用于构建API的高性能网络框架。
核心特征
- Fast:超高性能,性能与NodeJS和Go相似,构建于Python的Starlette和Pydantic框架之上
- fast to code:开发效率高
- Fewer bugs:减少约40%的人为引入的错误
- Intuitive:debug快捷
- Easy:易于使用和学习,花在文档上的时间更少
- Short:最小化代码重复,每个参数声明都对应了多个feature,更少bug
- Robust:production-ready代码,自动交互生成文档(automatic interactive documentation)
- Standards-based:基于并完全兼容OpenAPI(即Swagger)和Json Schema
系统要求
- Python3.7+
- Starlette:web part
- Pydantic:data part
- ASGI:Uvicorn或Hypercorn
需要安装fastapi和uvicorn
$ pip3 install fastapi
$ pip3 install uvicorn
最小可用案例 Minimal Viable Product, MVP
同步模式。创建入口文件main.py
如下
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
其中的Union
用于标识变量的类型,如下面写法标识变量a
可以是 int
或str
类型
from typing import Union
a: Union[int, str] # or a: [int or str]
a = 1
第二行声明变量a
的可能类型,但如果后面赋值在选定类型之外,依然可以赋值。命令Union
仅用于声明类型用,不会影响赋值。
异步模式。代码保存于文件app_fastapi.py
中
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
注意到代码中,两个路由都使用了GET
方法。
使用uvicorn
启动fastapi服务
>> uvicorn app_fastapi:app --host 127.0.0.1 --port 8888
INFO: Started server process [84364]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8888 (Press CTRL+C to quit)
指令说明
-
app_fastapi:app
:入口文件app_fastapi.py
中的app
对象,用app = FastAPI()
创建 -
--reload
:代码如果有update,则服务器重启,仅供开发环境使用 -
--host
:指定API的host -
--port
:指定API的port
在浏览器中调用http://127.0.0.1:8888/items/10?q=somecompany
,页面返回结果
{"item_id":10,"q":"axaim"}
可交互API文档 Interactive API docs
浏览器中输入http://127.0.0.1:8888/docs
,看到有Swagger UI提供的API交互式文档,或http://127.0.0.1:8888/redoc
,看到有redoc提供的API交互文档
![](https://img.haomeiwen.com/i7326185/a3136cdaa62dfdea.png)
![](https://img.haomeiwen.com/i7326185/307297c6bba31f00.png)
案例升级
在同步版本中加入PUT
方法
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
Reference
1 git, fastapi, tiangolo
网友评论