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