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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

carefree798

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值