- 为什么要进行强制类型校验?
- 在fastapi中如何进行数据结构的类型申明
- 在fastapi中如何使用
- 总结
为什么要进行强制类型校验?
我们知道python是弱语言类型,在使用过程中可以随意的改变变量的类型,
- 举个例子:在开发中,我们要计算一个商品的价格,sku_price = 7.28,然后你在后端计算逻辑的时候使用的都是float类型,但是前端或者客户端会说你这个字段sku_price 能不能给我传成字符串类型,我想你会做sku_price = str(7.28) 的处理,然后传递给前端或者客户端,在这个过程中你会发现这个字段一会儿是float类型,一会儿又是str类型,这个确实是一个很糟糕的处理。
- 再举一个例子:你是否在接手别人的代码的时候对方写了一个字段 response_data = {} 然后里面各种字段,你通过单步调试或者打日志会发现里面的字段构成是在变的,你是否被这中写法坑过,是否应为这种糟糕的写法出现bug的时候熬夜加班排查问题的经历,当然还有很多很多的原因我只列举了其中比较典型的两个例子做简单的说明。
在fastapi中如何进行数据结构的类型申明
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field
class GetRequest(BaseModel):
name: str = Field("haishiniu",description="用户名")
age: int = Field(18,description="年龄")
sex: str = Field("M",description="性别")
在fastapi中如何使用
- 方式一
from fastapi import FastAPI,Depends,Request from typing import Any, Dict from pydantic import BaseModel, Field app = FastAPI() class GetRequest(BaseModel): name: str = Field("haishiniu",description="用户名") age: int = Field(18,description="年龄") sex: str = Field(...,description="性别") @app.post("/info") async def info(req: GetRequest): print(type(req.age)) return { "user_name": req.name, "user_age": req.age, "user_sex": req.sex, }
- 方式二
from fastapi import FastAPI,Depends,Request from typing import Any, Dict, List, Optional from pydantic import BaseModel, Field app = FastAPI() class GetRequest(BaseModel): name: str = Field("haishiniu",description="用户名") age: int = Field(18,description="年龄") sex: str = Field(...,description="性别") async def get_common_query_params(request: Request) -> GetRequest: common_dict: Dict[str, Any] = dict( name=request.query_params.get("name") or "", age=request.query_params.get("age") or 0, sex=request.query_params.get("sex") or "", ) params = GetRequest(**common_dict,) return params @app.get("/infos/v1") async def info_v1(req: GetRequest = Depends(get_common_query_params)): print(type(req.age)) return { "user_name": req.name, "user_age": req.age, "user_sex": req.sex, }
简单说明
- 同一种功能既可以使用post也可以使用get方式进行数据请求,只是在处理数据的时候处理方式稍有不同,详情的使用过程在上面已经展示。
- 当我们的module中使用了默认值的时候,是可以不用传参数的,但当module中明确这个字段为必传字段时,若不传字段则接口就会报错。
- module中明确指定了字段的类型,若传入的参数能自动转化则会转化为我们指定的字段类型,若不能转化则会接口报错。
- 我们也可以通过类似:http://127.0.0.1:8000/docs 可视化的方式来查看我们的后端接口信息,这个功能在开发阶段还是很方便的,建议使用
总结
- 同一功能使用两种请求方式处理数据,在上文中已经提到,在实践的时候希望大家能根据业务场景进行有效选择。
- 我们通过实践验证了fastapi进行module之后是可以进行字段的约束的,我们可以清晰的看到请求的参数有哪些且每一个参数是上面类型的,当然返回的数据我们没有做module化,这个算是给大家留一个小的作业吧。
- 我们只是进行的一个demo级别的演示,是否有人有这样的疑问:请问我的参数是多层嵌套且有些参数是可选择的,那应该怎么处理呢?别急,关于生产环境复杂的使用情况我们下节在分享。