全面拥抱FasiApi ——三大参数及验证

网友投稿 873 2022-05-30

前几天写了一篇关于 FastApi 进阶的多应用程序管理蓝图APIRouter

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

快速:非常高的性能,性能可与NodeJS和Go相媲美(感谢Starlette 和 Pydantic)。现有最快的Python框架之一。

快速编码:将功能开发速度提高约200%至300%*。

更少的错误:减少约40%的人为错误(开发人员)。

直观:强大的编辑器支持,程序调试时间更少。

简易:易于使用和学习,减少阅读文档的时间。

短:最小化重复代码,每个参数声明中的多个功能,减少编码错误。

健壮:获取可用于生产的代码。具有自动交互式的 API 文档。

基于标准:基于(并完全兼容)API 的开放标准:OpenAPI(以前称为Swagger)和JSON Schema。

前面说过 FastApi 的一大特点是基于标准的 Python 3.6类型声明,兼具参数校验功能,这一切都要归功于 Pydantic

路径参数

路径参数即 url 路径参数,可以使用 Python 格式字符串相同语法声明路径“参数”或“变量”,例如:

from fastapi import FastAPI app = 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 打印出来即可看到 ?之后的键值对参数

全面拥抱FasiApi ——三大参数及验证

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

from fastapi import FastAPI app = 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 FastAPI app = 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 FastAPI app = 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 FastAPI import uvicorn from pydantic import BaseModel app = 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 FastAPI from pydantic import BaseModel class Item(BaseModel): name: str description: str = None price: float tax: float = None app = 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

HTML Python

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:30行代码实现蚂蚁森林自动偷能量
下一篇:Go 语言编程 — gorm 数据库版本迁移
相关文章