FastAPI准备之pydantic类型检查工具

2023-11-19

  • 官方文档: https://pydantic-docs.helpmanual.io/
  • 这些组织都在用: Jupyter notebook ; FastAPI ; Amazon Web Services ; Uber ; Microsoft
  • 优势: 可以和IDE结合, 可以读取环境变量, 对环境变量做一些检查, 对一些用Python做自动化运维的人来说是福音,比其他的类型检查库要快,可以校验复杂的数据结构(validator),集成到FastAPI框架中写起来会很优雅, Django的DRF也有自己的序列化框架,Golang的Gin框架同样也是.FastAPI和Gin一样优雅, 很喜欢, 并且对扩展开放, 用户可以自定义校验规则
  • 官方的复杂校验案例:
from pydantic import BaseModel, ValidationError, validator

class UserModel(BaseModel):
    name: str
    username: str
    password1: str
    password2: str

    @validator('name')
    def name_must_contain_space(cls, v):
        if ' ' not in v:
            raise ValueError('must contain a space')
        return v.title()

    @validator('password2')
    def passwords_match(cls, v, values, **kwargs):
        if 'password1' in values and v != values['password1']:
            raise ValueError('passwords do not match')
        return v

    @validator('username')
    def username_alphanumeric(cls, v):
        assert v.isalpha(), 'must be alphanumeric'
        return v

print(UserModel(name='samuel colvin', username='scolvin', password1='zxcvbn',
                password2='zxcvbn'))
#> name='Samuel Colvin' username='scolvin' password1='zxcvbn' password2='zxcvbn'

try:
    UserModel(name='samuel', username='scolvin', password1='zxcvbn',
              password2='zxcvbn2')
except ValidationError as e:
    print(e)
"""
2 validation errors for UserModel
name
  must contain a space (type=value_error)
password2
  passwords do not match (type=value_error)
"""
  • 不想用BaseModel可以用优雅的装饰器语法
from datetime import datetime
from pydantic.dataclasses import dataclass

@dataclass
class User:
    id: int
    name: str = 'John Doe'
    signup_ts: datetime = None

user = User(id='42', signup_ts='2032-06-21T12:00')
print(user)
  • 安装上手pip install pydantic
from typing import List
from datetime import datetime
from pydantic import BaseModel, ValidationError


class User(BaseModel):
    id: int
    name = "chr"
    signUp_ts: datetime = None
    friends: List[int] = []


data = {
    "id": 123,
    "signUp_ts": datetime.now(),
    "friends": [1, 2, "a"]  # 这里会将"3"自动转换成int类型,如果不符合类型会自动检查出来抛错
}
try:
    user = User(**data)
except ValidationError as e:
    print(e.json())


# print(user.id)
# print(user.name)
# print(user.signUp_ts)
# print(user.friends)
# print(user.__dict__)
  • 如果不符合类型检查抛错
    在这里插入图片描述

  • 最后附上Benchmark数据(比DRF快了好多啊)

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FastAPI准备之pydantic类型检查工具 的相关文章

随机推荐

  • sql优化

    SQL总结 优化部分 1 应尽量避免在 where 子句中使用 或 lt gt 操作符 否则将引擎放弃使用索引而进行全表扫描 2 对查询进行优化 应尽量避免全表扫描 首先应考虑在 where 及 order by 涉及的列上建立索引 3 应
  • 模糊数学Python(一)模糊运算

    代码 import numpy as np def istype a 判断模糊矩阵a的类型 a np array a s np eye a shape 0 a shape 1 if a gt s all and a T a all retu
  • 安装12.04lts的两个问题总结

    因为在win7下有很多bug 老师叫我用Linux来完成项目的最后一步 啊啊啊 之前一直是在虚拟机里面搞 安装Ubuntu的过程中遇到了好多个问题 好吧好吧 下面总结一下 让遇到同样问题的朋友少走点弯路吧 1 分区问题 建立 主分区 之后
  • 数据操作之-dataframe常见操作:取行、列、切片、统计特征值

    import numpy as np import pandas as pd from pandas import from numpy import data DataFrame np arange 16 reshape 4 4 inde
  • Spring Boot 学习研究笔记(十八) 添加log4j2日志文件

    Spring Boot 添加log4j2日志文件 对于一个线上程序或者服务而言 重要的是要有日志输出 这样才能方便运维 而日志的输出需要有一定的规划 如日志命名 日志大小 日志分割的文件个数等 在SpringBoot的框架下 会使用log4
  • 栈头文件C语言

    Stack ADT h 栈模型头文件 数据类型定义 typedef char Name typedef struct stack node Name name struct stack node next Stack Node typede
  • GD32450i-EVAL学习笔记 6 - ADC

    目录 1 初始化ADC 1 1 使能RCU 1 2 设置频率 1 3 设置分辨率 1 4 设置数据对齐方式 1 5 使能扫描模式 1 6 设置触发模式 1 6 使能ADC 2 初始化通道规则 3 通道使能 4 软件触发使能 5 获取ADC的
  • C#List类容输出

    将集合中的类容 添加间隔符号后 输出为string List
  • vue之babel自动埋点

    公司项目是vue单页面技术 这天组长对我说 为了凸显我们的作用 做点外行或者新手看起来高深的东西 例如自动埋点 当时我的表情先是 然后摸鱼摸习惯了 就是这种状态 最后组长说领导的态度决定我们的绩效 没办法 为了money 无奈打开了老朋友
  • nacos集群部署遇到的问题总结

    问题一 内存不足 问题描述 nacos is starting with cluster Error occurred during initialization of VM Could not reserve enough space f
  • Eclipse android apk打包

    Eclipse android 开发更改apk名字 有以下几步 第一步 修改工程包名 在eclipse里 找到项目包和java包 原则上都一样 就可以按 F2 修改名字 随之 源 java也会得到相应的修改 然而每个 java文件都需要把如
  • Fortify 代码扫描安装使用教程

    前言 Fortify 能够提供静态和动态应用程序安全测试技术 以及运行时应用程序监控和保护功能 为实现高效安全监测 Fortify具有源代码安全分析 可精准定位漏洞产生的路径 以及具有1分钟1万行的扫描速度 Fortify SCA 支持丰富
  • 现在投资创客教育

    很多人会问创客要不要投资 就像吃西红柿鸡蛋面要不要用刀叉一样 你当然可以用 也可以用筷子 格物斯坦表示如果没有筷子 喜欢用手抓着吃也是可以的啊 投资人是路径的一种 不是唯一 更不是全部 投资创客教育是教育培训行业比较热门的话题 该行业未来是
  • Python基础语法学习之变量与赋值

    近几年Python飞速发展 开始学习Python的人群不在仅仅局限于编程开发者 许多其他行业的从业者也开始将Python作为自己的职业技能 本文仍然是针对零基础的初学者 继续学习Python的基础语法 变量与赋值 主要内容包括变量和赋值的概
  • el-checkbox-group限制勾选数量

  • 代理模式:静态代理和动态代理

    代理模式 代理对象增强对目标对象的功能 分类 静态代理 动态代理 jdk代理通过实现接口 cglib通过实现类实现 静态代理 JDK动态代理 CGLIB代理模式 通过回调拦截器方法实现代理对象的生成
  • 【计算机视觉】直接线性变换(DLT)求解P矩阵(2 使用SVD分解)(附MATLAB代码)

    引言 之前的帖子已经完成了一种计算直接线性变换的方法 是直接通过矩阵运算来进行的 不过随后得到的结果并不能满足精度要求 如果只是用来作为迭代优化的一个初值的话 对于精度的要求倒也不用那么高 但在查阅资料时又发现了另一种解法 是通过SVD分解
  • DataFrame对象创建

    文章目录 前言 一 创建DataFrame对象 二 使用步骤 前言 一 创建DataFrame对象 示例 将字典 年龄 23 22 21 岗位 客服 运营 公关 年购买量 10 15 8 转换成一个DataFrame对象 二 使用步骤 代码
  • 搭建主数据管理平台,解决多个系统数据不统一的问题

    如今的电子产业环境要求电子制造商必须能对产业中的各种变化做出迅速的反应 而这些变化产生了前所未有的大量数据 包括来自产品类别增加 供应中断和需求波动以及其它因素等多方面的数据 这些数据以多种格式存在于各种系统之中 虽然 企业为管理它们花费了
  • FastAPI准备之pydantic类型检查工具

    官方文档 https pydantic docs helpmanual io 这些组织都在用 Jupyter notebook FastAPI Amazon Web Services Uber Microsoft 优势 可以和IDE结合 可