FastAPI Web框架 [Pydantic]
Posted 再认真点
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastAPI Web框架 [Pydantic]相关的知识,希望对你有一定的参考价值。
学习一下,做个记录。
Starlette,Pydantic 与 FastAPI 的关系
- Python 的类型提示 type hints
- Pydantic 是一个基于 Python 类型提示来定义数据验证,序列化和文档(使用JSON 模式)库。
- Starlette 是一种轻量级的 ASGI 框架/工具包,是构建高性能 Asyncio 服务的理想选择。
from datetime import datetime,date
from pydantic import BaseModel,ValidationError, constr
from pathlib import Path
from typing import List, Optional
from sqlalchemy import Column, Integer, String #ORM
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.ext.declarative import declarative_base
class User(BaseModel):
id: int #必填字段
name: str = "John Snow" #有默认值,选填字段
signup_ts: Optional[datetime] = None #有默认值,选填字段
friends: List[int] = [] # 列表中的元素是int类型或者可以直接转换为int类型
external_data =
"id": "123",
"signup_ts": "2022-6-16 11:15",
"friends": [1,2,"3"]
user = User(**external_data)
print(user.name,user.friends) # 实例化后调用属性
print(repr(user.signup_ts)) # repr() 函数将对象转化为供解释器读取的形式。
print(user.dict())
try:
User(id=1, signup_ts=datetime.today(), friends=[1,2,"not number"])
except ValidationError as e:
print(e.json())
print(user.dict())
print(user.json())
print(user.copy()) # 浅拷贝
print(User.parse_obj(obj=external_data))
print(User.parse_raw('"id": 123, "name": "John Snow1", "signup_ts": "2022-06-16T11:15:00", "friends": [1, 2, 3]'))
path = Path('pydantic_test.json')
path.write_text('"id": 123, "name": "John Snow1", "signup_ts": "2022-06-16T11:15:00", "friends": [1, 2, 3]')
print(User.parse_file(path))
print(user.schema())
print(user.schema_json())
user_data = "id": "error", "name": "John Snow1", "signup_ts": "2022-06-16T11:15:00", "friends": [1, 2, 3]
print(User.construct(**user_data)) #construct()不校验数据直接创建模型类,不建议在construct方法中传入未经验证的数据
print(User.__fields__.keys()) #查看所有字段,定义模型类的时候,所有字段都注明类型,字段顺序就不会乱
class Sound(BaseModel):
sound: str
class Dog(BaseModel):
birthday: date
weight: float = Optional[None]
sound: List[Sound] #不同的狗有不同的叫声。递归模型(Recursive Models)就是指一个嵌套一个
dogs = Dog(birthday=date.today(), weight=6.66, sound=[
"sound": "wang wang",
"sound": "ying ying"
])
print(dogs.dict())
Base = declarative_base()
class CompanyOrm(Base):
__tablename__ = 'companies' #表名
id = Column(Integer, primary_key=True, nullable=False) #主键,不能为空
public_key = Column(String(20), index=True, nullable=False, unique=True)
name = Column(String(63), unique=True)
domains = Column(ARRAY(String(255)))
class CompanyMode(BaseModel):
id: int
public_key: constr(max_length=20)
name: constr(max_length=63)
domains: List[constr(max_length=255)]
class Config:
orm_mode = True
# 数据表模型类的实例
co_orm = CompanyOrm(
id = 123,
public_key = 'forbar',
name = 'Testing',
domains = ['example.com', 'test.com']
)
print(CompanyMode.from_orm(co_orm))
学习:https://www.bilibili.com/video/BV1iN411X72b?p=7&spm_id_from=pageDriver&vd_source=06af20c53d413fe5fafd741f14bacbf1
以上是关于FastAPI Web框架 [Pydantic]的主要内容,如果未能解决你的问题,请参考以下文章