pydantic库是什么
背景
FastAPI 站在巨人的肩膀上,其中之一就是Pydantic.
pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误。
看看什么是pydantic
官网:https://pydantic-docs.helpmanual.io/
其他博客:https://blog.csdn.net/codename_cys/article/details/107675748
总结一句话:pydantic保证输出模型的类型和约束。你搭建了一套web服务,提供了很多接口,每个接口需要接受什么样类型的参数那都是有定数的,不能让别人随便给你传参啊,这就可以使用pydantic来校验或者强制转换成我们希望的数据类型。
如何使用
from pydantic import BaseModel
class Person(BaseModel):
name: str
# 1.直接传值
p1 = Person(name='tarzan111')
print(p1.json())
# 1.1 如果传的是是int型,会自动转型。如果无法自动转换那就报错了
_p1 = Person(name=123)
print(_p1.json())
# 2.通过字典传值
data2 = {
'name': 'tarzan222',
'age': '28' # age会被自动过滤
}
p2 = Person(**data2)
print(p2.json())
输出:
{"name": "tarzan111"}
{"name": "123"}
{"name": "tarzan222"}
更多类型说明
from pydantic import BaseModel
from typing import Dict, List, Sequence, Set, Tuple
class Demo(BaseModel):
a: int # 整型
b: float # 浮点型
c: str # 字符串
d: bool # 布尔型
e: List[int] # 整型列表
f: Dict[str, int] # 字典型,key为str,value为int
g: Set[int] # 集合
h: Tuple[str, int, int] # 元组
data1 = {
'a': 1,
'b': 1.1,
'c': 'tarzan',
'd': True,
'e': [1, 2, 3],
'f': {'name': 123, 'age': 29},
'g': {1, 5, 7, 8, 9, 4, 2, 2, 2},
'h': (True, 2, 3)
}
demo1 = Demo(**data1)
print(demo1.json())
print(demo1.d)
输出:
{"a": 1, "b": 1.1, "c": "tarzan", "d": true, "e": [1, 2, 3], "f": {"name": 123, "age": 29}, "g": [1, 2, 4, 5, 7, 8, 9], "h": ["True", 2, 3]}
True
typing模块的作用: https://docs.python.org/zh-cn/3/library/typing.html
可以使用别名:
from typing import Dict, List, Sequence, Set, Tuple
Vector = List[float]
def scale(scalar: float, vector: Vector) -> Vector:
return [scalar * num for num in vector]
print(scale(2.0, [2.0, 3.0]))
输出:
[4.0, 6.0]
更多过滤方法
from pydantic import BaseModel, Field
from typing import Optional, Union
class Tarzan(BaseModel):
a: int = Field(..., gt=0, lt=5) # ...是必传参
b: int = Field(0) # 有默认值 0
c: int = 1 # 也是默认 0
d: Optional[int] # 可选参数 不传则为 null
time: Union[int, str] # int 或 str
password: str = Field(..., alias="key") # 传参是使用别名 key 来代替password
t1 = Tarzan(a=2, time=2023, key='123456')
print(t1.json())
输出
{"a": 2, "b": 0, "c": 1, "d": null, "time": 2023, "password": "123456"}
配置环境
可以阅读:https://www.duyixian.cn/2022/05/20/manage-app-configuration-with-pydantic/
新建config.py
from pydantic import BaseSettings
class Settings(BaseSettings):
env: str = 'dev'
app_key: str = 'app_key'
app_secret: str = 'secret'
def get_setting():
setting = Settings()
return setting
if __name__ == '__main__':
s = get_setting()
print(s.json())
输出:
{"env": "dev", "app_key": "app_key", "app_secret": "secret"}
这里需要注意BaseSettings
会获取系统中的环境变量:
- 打开终端输入:
export env=test
- 然后执行
python3 -m config.py
,这时就会输出
{"env": "test", "app_key": "app_key", "app_secret": "secret"}