Fastapi优势和特性
略
Starlette,Pydantic 与 FastAPI 的关系
Pydantic 是一个基于 Python 类型提示来定义数据验证,序列化和文档(使用 JSON 模式)库
Starlette 是一种轻量级的 ASGI 框架/工具包,是构建高性能 Asyncio 服务的理想选择
python的编程语言提示补足type hints发展而来Pydantic库,FatsAPI就是包含了Pydantic和Starlette以及引入新的语言特性组成的
Starlette是轻量级ASGI框架/工具包,ASCI作为一种服务而言的约定适用于FASTAPI,同样WSGI作为服务约定用于Dijango和Flask,其下的白框都是其框架所对应可以pip下载和使用的包,使用频率由近及远
安装依赖包
FastAPI本课程用到环境在txt文档
安装所依赖的包和环境(现在一次性全部安装和之后边学边安装都行)
要求python环境在3.6以上
cmd执行pycharm编辑器的虚拟环境位置
cd /d E:\Users\Slaine\PycharmProjects\pythonProject1\venv\Scripts
activate.bat #执行启动虚拟环境,之后路径前有(venv)标识
cd 到 requirements.txt 文件所在目录下
pip install -r requirements.txt #即可安装
这种报错是把梯子/代理关了就行。
指定镜像源可加速下载,非常有用
pip install xxxx -i https://pypi.tuna.tsinghua.edu.cn/simple #指定镜像源可以加速下载
pydantic库学习
pydantic中BaseModel类
数据导入类
校验失败处理
模型类的属性和方法
数据写入文件
递归/嵌套模型
代码详解
from datetime import datetime
from pydantic import BaseModel
from typing import List, Optional
from pathlib import Path
class User(BaseModel):
id: int #无默认值所以是必填字段
name: str = "Slaine Troyard" #可选字段,有默认字符串
signup_ts: Optional[datetime] #可选字段,默认为None
friends: List[int] = [] #列表中元素为int类型或者可转换为int
external_data = {
"id": "123",
"singnup_ts": "2022-7-12 20:51",
"friends": [1, 2, "3"] #满足friends要求
}
print("-------------------------------")
#使用python解包方式 ** ,将external_data数据传到类模板中实例化
user = User(**external_data)
print(user.id, user.friends) #打印出实例化对象指定属性
print(user.dict()) #以字典形式打印出对象内容(字符串3被自动转换为int)
###----校验失败处理
try:
User(id=1, signup_ts=datetime.today(), friends=[1,2,"not number"])
except ValueError as e:
print(e.json()) #将报错json格式化
print("----------------------------------")
###模型类的属性和方法
print(user.dict())
print(user.json())
print(user.copy())
print(User.parse_obj(obj=external_data))#解包的方法,解析字典数据
print(User.parse_raw('{"id": "123", "name": "Slaine Troyard", "signup_ts": "2022-7-12 20:51", "friends": [1, 2, 3]}')) #解析原生数据
#数据写入文件
path = Path('pydantic_writin.json')
path.write_text('{"id": "123", "name": "Slaine Troyard", "signup_ts": "2022-7-12 20:51", "friends": [1, 2, 3]}')
print(User.parse_file(path))
print("----------------------------------")
print(user.schema())
print(user.schema_json())#显示输出数据的格式和方案
print(user.construct()) #不检验数据直接创建模型类||与parse_obj相比它不作自动校验
print("----------")
print(User.__fields__.keys())
print("----------------------------------")
####递归/嵌套模型
class Sound(BaseModel):
sound: str
class Dog(BaseModel):
birthday: datetime
weight: float = Optional[None]
sound: List[Sound]
dogs = Dog(birthday=datetime.today(), weight=12.3, sound=[{
"sound":"wang wang"}, {
"sound": "ying ying"}])
print(dogs.dict())