FastAPI基本, 2022-10-30

(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可以是 intstr类型

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交互文档

API doc by Swagger

API doc by Redoc

案例升级

在同步版本中加入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

你可能感兴趣的:(FastAPI基本, 2022-10-30)