返回顶部

Fastapi 基本介绍

基本介绍

FastAPl的主要特点

  • 性能优越

  • 开发效率高200%~300%↑

  • 减少约40%人为BUG

  • 直观

  • 易学易用

  • 精简编码代码重复率低

  • 自带AP交互文档开发成果随时交付

  • AP开发标准化

Starlette,Pydantic与FastAPI的关系

  • Python的类型提示type hints

  • Pydantic是一个基于Python类型提示来定义数据验证,序列化和文档(使用SON模式)库

  • Starlette是一种轻量级的ASGl框架/工具包,是构建高性能Asyncio服务的理想选择

     

ASGI 和 WSGI 部署常用的包

 pytantic 基本使用

使用Python的类型注解来进行数据校验和settings管理,Pydantic可以在代码运行时提供类型提示,数据校验失败时提供友好的错误提示,定义数据应该如何在纯规范的Python代码中保存,并用Pydantic验证它

数据自动转换

from pydantic import BaseModel
from datetime import datetime

from typing import Optional, List


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": "2020-12-22 12:22",
    "friends": [1, 2, "3"],  # "3"是可以int("3")的
}
user = User(**external_data)
print(user.dict())

输入的 friends 中的字段串转换成定义int类型,signup_ts 转换成定义的时间类型

模型类的属性和方法

print(user.dict())
print(user.json())
print(user.copy())  # 这里是浅拷贝
print(User.parse_obj(external_data))
print(User.parse_raw('{"id": "123", "signup_ts": "2020-12-22 12:22", "friends": [1, 2, "3"]}'))

path = Path('pydantic_tutorial.json')
path.write_text('{"id": "123", "signup_ts": "2020-12-22 12:22", "friends": [1, 2, "3"]}')
print(User.parse_file(path))

print(user.schema())
print(user.schema_json())

user_data = {"id": "error", "signup_ts": "2020-12-22 12 22", "friends": [1, 2, 3]}  # id是字符串 是错误的
print(User.construct(**user_data))  # 不检验数据直接创建模型类,不建议在construct方法中传入未经验证的数据

print(User.__fields__.keys())  # 定义模型类的时候,所有字段都注明类型,字段顺序就不会乱

校验失败处理

from pydantic import BaseModel, ValidationError
from datetime import datetime

from typing import Optional, List


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": "2020-12-22 12:22",
    "friends": [1, 2, "3"],  # "3"是可以int("3")的
}
try:
    User(id=1, signup_ts=datetime.today(), friends=[1, 2, "not number"])
except ValidationError as e:
    print(e.json())

递归模型

from pydantic import BaseModel
from datetime import datetime, date

from typing import Optional, List

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())

ORM模型:从类实例创建符合ORM对象的模型

 

from pydantic import BaseModel
from pydantic import constr

from typing import List
from sqlalchemy import Column, Integer, String
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.orm import declarative_base


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 CompanyModel(BaseModel):
    id: int
    public_key: constr(max_length=20)
    name: constr(max_length=63)
    domains: List[constr(max_length=255)]

    class Config:
        from_attributes = True


co_orm = CompanyOrm(
    id=123,
    public_key='foobar',
    name='Testing',
    domains=['example.com', 'foobar.com'],
)

print(CompanyModel.from_orm(co_orm))

 

posted @ 2024-06-12 11:02  Crazymagic  阅读(6)  评论(0编辑  收藏  举报