前几天写了一篇对于 FastApi 进阶的多应用程序治理蓝图APIRouter,可能对于有些没有根底的敌人看起来会有点懵,所以前面会依照由浅及深的程序进行更新,记得关注噢

先看下 FastAPI 有哪些突出特点,官网介绍如下:

疾速:十分高的性能,性能可与NodeJSGo相媲美(感激Starlette 和 Pydantic)。现有最快的Python框架之一。
疾速编码:将性能开发速度进步约200%至300%*。
更少的谬误:缩小约40%的人为谬误(开发人员)。
直观:弱小的编辑器反对,程序调试工夫更少。
繁难:易于应用和学习,缩小浏览文档的工夫。
:最小化反复代码,每个参数申明中的多个性能,缩小编码谬误。
强壮:获取可用于生产的代码。具备主动交互式的 API 文档。
基于规范:基于(并齐全兼容)API 的凋谢规范:OpenAPI(以前称为Swagger)和JSON Schema。

后面说过 FastApi 的一大特点是基于规范的 Python 3.6类型申明,兼具参数校验性能,这所有都要归功于 Pydantic

门路参数

门路参数即 url 门路参数,能够应用 Python 格局字符串雷同语法申明门路“参数”或“变量”,例如:

from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")async def read_item(item_id: int, q: str = None):    return {"item": item_id, "q": q}

path 参数的值 item_id 将作为参数传递给视图函数,运行命令:

uvicorn 文件名:app

默认端口是 8000,也能够指定 host 和 port , --host=0.0.0.0 --port=8008

运行之后,在浏览器种关上 http://127.0.0.1:8000/items/1,能够看到响应:

{"item":1,"q":null}

其中 item_id 被申明为 int 类型,q 为 可选参数,默认为None,所以响应中的 q 是 None

当咱们通过 http://127.0.0.1:8000/items/test 去拜访的时候, 能够看到一个十分敌对的谬误响应

{    "detail": [        {            "loc": [                "path",                "item_id"            ],            "msg": "value is not a valid integer",            "type": "type_error.integer"        }    ]}

因为 path 参数 item_id 的值是 "test" 不能转为 int,这就是加入验证

查问参数

查问参数也是带在 url 地址中的,是 url 中位于 ?之后的一组键值对,以 & 字符分隔,这对爬虫敌人来说再相熟不过了,比方上面的申请参数

data = {"test": 1, "name": "Python编程与实战"}response = requests.get(url, params=data)

以 关键字参数 params 传过来的就是查问参数,你能够将其中的 response.url 打印进去即可看到 ?之后的键值对参数

那么在服务端 FastApi 如何来接管这种参数呢? 请看代码

from fastapi import FastAPIapp = FastAPI()fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]@app.get("/items/")async def read_item(skip: int = 0, limit: int = 10):    return fake_items_db[skip : skip + limit]

运行后输出地址:http://127.0.0.1:8000/items/?skip=0&limit=10

查问参数为:

  • skip:值为 0
  • limit:值为 10

留神这两个参数都带有默认值,能够抉择只传一个

可选参数

同样,您能够通过将可选查问参数的默认值设置为来申明可选查问参数 None

from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")async def read_item(item_id: str, q: str = None):    if q:        return {"item_id": item_id, "q": q}    return {"item_id": item_id}

必须查问参数

将下面代码中的 q: str 去掉 None,则 q 变成了必须查问参数,也就是必传的,否则会提醒谬误

{    "detail": [        {            "loc": [                "query",                "q"            ],            "msg": "field required",            "type": "value_error.missing"        }    ]}

给大伙总结一下,在理论代码中可能会用到必须参数,默认参数,可选参数,如下:

from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")async def read_user_item(item_id: str, needy: str, skip: int = 0, limit: int = None):    item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit}    return item

在这种状况下,有3个查问参数:

  • needy,是必须的 str 。
  • skip,int 默认值为 0。
  • limit,可选的 int。

其中还有一个是门路参数:item_id, str 类型

申请体参数

要发送申请注释,必须应用一个:POST, PUT,DELETE或PATCH,需导入 Pydantic 的 BaseModel

from fastapi import FastAPIimport uvicornfrom pydantic import BaseModelapp = FastAPI()class CommonItem(BaseModel):    token: str    message_id: str    to_id: str    from_info: str    strategy: int or str = 0  # 默认为0,可不传该参数,然而不能传空字符串    type: str or int  # str 和 int 类型都反对    from_id: str    to_info: str    content: str = None@app.post("/test")async def tests(item: CommonItem):    return item

能够看到,创立了一个 CommonItem 模型,有了申明的这个模型,能够实现以下性能:

  • 以 JSON 读取申请的注释
  • 依据申明的类型,主动对参数进行转换
  • 验证数据,如果数据有效,它将返回一个清晰的谬误,指出谬误数据的确切地位和起源
  • 在参数中接管收到的数据 item,并能获取所有属性及所有编辑器的反对

同时,FastApi 能够主动帮咱们辨认申请 body 参数, 门路参数以及查问参数,并精确的获取参数数据。例如以下代码:

from fastapi import FastAPIfrom pydantic import BaseModelclass Item(BaseModel):    name: str    description: str = None    price: float    tax: float = Noneapp = FastAPI()@app.put("/items/{item_id}")async def create_item(item_id: int, item: Item, q: str = None):    result = {"item_id": item_id, **item.dict()}    if q:        result.update({"q": q})    return result

上述代码,参数将被自动识别:

  • item_id,: 门路参数
  • q: 参数是一个的繁多类型(如int,float,str,bool,等等)将被解释为一个查问参数
  • item: 参数申明为 Pydantic 模型的类型,则将被解释为申请 body