什么是FastAPI异步框架?(全面了解)
一:FastAPI框架
1.FastAPI是应该用于构建API的现代,快速(高性能)的 web 框架,使用Python 3.6+ 并基于标准的 Python 类型提示。
关键性:
- 快速: 可与NodeJS和Go并肩的极高性能(归功于Starlette和Pydantic)。最快的Python web框架之一。
- 高效编码: 提高功能开发速度约200% 至 300%。
- 更少的bug: 减少约 40% 的人为(开发者) 导致错误。
- 智能: 极佳的编辑器支持。处处皆可自动补全,减少调式时间。
- 简单: 设计的易于使用和学习,阅读文档的时间。
- 简短: 使代码重复最小化。通过不同的参数声明实现丰富功能。bug更少。
- 健壮: 生产可用级别的代码。还有自动生成的交互式文档。
- 标准化: 基于(并完全兼容)API的相关开放标准: OpenAPI(以前被称为 Swagger)和 JSON Schema。

1.Starlette,Pydantic 与 FastAPI 的关系
- Python 的类型提示 type hints
- Pydantic 是一个基于 Python 类型提示来定义数据验证,序列化和文档(使用JSON模式)库
Pydantic : 前端给后端传数据/定义的数据类型,嵌套用什么格式嵌套
- Starlette 是一种轻量级的 ASGI 框架/工具包,是构建高性能Asyncio 服务的理想选择。
- 一个轻量级、低复杂度的 HTTP Web 框架。
- WebSocket 支持。
- 正在进行的后台任务。
- 启动和关闭事件。
- 测试客户端建立在
requests. - CORS、GZip、静态文件、流响应。
- 会话和 Cookie 支持。
- 100% 的测试覆盖率。
- 100% 类型注释代码库。
- 很少有硬依赖。
asyncio与trio后端兼容。- 与独立基准相比,整体表现出色。

2.ASGI 和 WSGI的区别
ASGI 协议
WSGI 协议
Uvicorn 与 uWSGI 为web服务器

二:Pydantic的基本用法(BaseModel)
1.Pydantic的基本用法
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-12-22 12:22",
"friends": [1, 2, "3"] # "3" 是可以int("3")的
}
user = User(**external_data)
print(user.id, user.friends) # 实例化后调用属性
print(repr(user.signup_ts))
print(user.dict())
"
123 [1, 2, 3]
datetime.datetime(2022, 12, 22, 12, 22)
{'id': 123, 'name': 'john Snow', 'signup_ts': datetime.datetime(2022, 12, 22, 12, 22), 'friends': [1, 2, 3]}
"
2.效验失败处理
print("---效验失败处理---")
try:
User(id=1, signup_ts=datetime.today(), friends=[1, 2, "not number"])
except ValidationError as e:
print(e.json())
"
[
{
"loc": [
"friends",
2
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
"
3.模型类的属性和方法
print(user.dict()) # 转换成字典
print(user.json())
print(user.copy()) # 这里代表浅拷贝
print(User.parse_obj(obj=external_data)) # 解析
print(User.parse_raw('{"id": "123","signup_ts": "2022-12-22 12:22", "friends": [1, 2, 3]}'))
"
{'id': 123, 'name': 'john Snow', 'signup_ts': datetime.datetime(2022, 12, 22, 12, 22), 'friends': [1, 2, 3]}
{"id": 123, "name": "john Snow", "signup_ts": "2022-12-22T12:22:00", "friends": [1, 2, 3]}
id=123 name='john Snow' signup_ts=datetime.datetime(2022, 12, 22, 12, 22) friends=[1, 2, 3]
id=123 name='john Snow' signup_ts=datetime.datetime(2022, 12, 22, 12, 22) friends=[1, 2, 3]
id=123 name='john Snow' signup_ts=datetime.datetime(2022, 12, 22, 12, 22) friends=[1, 2, 3]
"
4.解析文件
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))
"
id=123 name='john Snow' signup_ts=datetime.datetime(2020, 12, 22, 12, 22) friends=[1, 2, 3]
"
5.解析(并打印出对应类型)
print(user.schema())
print(user.schema_json())
#
user_data = {"id": "error", "signup_ts": "2020-12-22 12 22", "friends": [1, 2, 3]} # id必须是str
print(User.construct(**user_data)) # 不效验数据直接创建模型类,不建议在construct方法中传入未经验证的数据
#
print(User.__fields__.keys()) # 定义模型类的时候,所有字段都注明类型,字段顺序就不会乱。
"
{'title': 'User', 'type': 'object', 'properties': {'id': {'title': 'Id', 'type': 'integer'}, 'name': {'title': 'Name', 'default': 'john Snow', 'type': 'string'}, 'signup_ts': {'title': 'Signup Ts', 'type': 'string', 'format': 'date-time'}, 'friends': {'title': 'Friends', 'default': [], 'type': 'array', 'items': {'type': 'integer'}}}, 'required': ['id']}
{"title": "User", "type": "object", "properties": {"id": {"title": "Id", "type": "integer"}, "name": {"title": "Name", "default": "john Snow", "type": "string"}, "signup_ts": {"title": "Signup Ts", "type": "string", "format": "date-time"}, "friends": {"title": "Friends", "default": [], "type": "array", "items": {"type": "integer"}}}, "required": ["id"]}
name='john Snow' signup_ts='2020-12-22 12 22' friends=[1, 2, 3] id='error'
dict_keys(['id', 'name', 'signup_ts', 'friends'])
"
6.递归模型
class Sound(BaseModel):
sound: str
class Dog(BaseModel):
birthday: date
weight: float = Optional[None]
sound: List[Sound] # 不同的狗有不同的叫声。递归模型(Recursive Model)就是指一个嵌套一个
dogs = Dog(birthday=date.today(), weight=6.66, sound=[{"sound": "wang wang ~"}, {"sound": "ying ying ~"}])
print(dogs.dict())
"
{'birthday': datetime.date(2022, 6, 9), 'sound': [{'sound': 'wang wang ~'}, {'sound': 'ying ying ~'}]}
"
7.ORM模型:从类实例创建符合ORM对象的模型
from sqlalchemy import Column, Integer, String
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.ext.declarative 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 CompanyMode(BaseModel):
id: int
public_key: constr(max_length=20) # constr = 限制
name: constr(max_length=63)
domains: List[constr(max_length=255)]
class Config: # 子类
orm_mode = True
co_orm = CompanyOrm(
id=123,
public_key = 'foobar',
name='Testing',
domains=['example.com', 'imooc.com']
)
print(CompanyMode.from_orm(co_orm))
"
id=123 public_key='foobar' name='Testing' domains=['example.com', 'imooc.com']
"
什么是FastAPI异步框架?(全面了解)的更多相关文章
- 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)
1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...
- Android 异步框架 RxJava2
观察者模式的概念 RxJava是android的异步框架,官方介绍是可观测的序列,组成异步基于事件程序的库.特点是观察者模式,基于事件流的链式调用,随着异步操作调度过程复杂的情况下,程序逻辑也变得越来 ...
- 基于SEDA的异步框架设计与实现
基于SEDA的异步框架设计与实现 二.为什么使用SEDA 目前,面对并发环境,主流互联网服务器编程模型有两种:多线程模型以及事件驱动模型.但是这两个模型都不足以解决这个问题.我们来首先看一下这两种编程 ...
- jQuery异步框架探究1:jQuery._Deferred方法
jQuery异步框架应用于jQuery数据缓存模块.jQuery ajax模块.jQuery事件绑定模块等多个模块,是jQuery的基础功能之中的一个.实际上jQuery实现的异步回调机制能够看做ja ...
- Tornado中异步框架的使用
tornado的同步框架与其他web框架相同都是处理先来的请求,如果先来的请求阻塞,那么后面的请求也会处理不了.一直处于等待过程中.但是请求一旦得到响应,那么: 请求发送过来后,将需要的本站资源直接返 ...
- celery分布式异步框架
1.什么是Celery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组成,消息中间件( ...
- flask+gevent的异步框架
一:flask本身的框架时什么? 基于Wsgi的Web应用框架 二:为什么要实现异步架构? 增加并发处理能力 三:实现异步架构 from gevent import monkey from geven ...
- django项目学习之异步框架celery
最近用django一个网上商城项目的时候用两个扩展,感觉还不错,所以在此记录一下. 首先来说下celery,celery是一个处理异步任务的框架,需要下载celery包,一般在项目需要进行耗时操作的时 ...
- 异步框架asyn4j的原理
启动时调用init方法 public void init(){ if (!run){ run = true; //工作队列 workQueue = newPriorityBlockingQueue(m ...
随机推荐
- 配置Linux的时钟同步
公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ Ubuntu系统默认的时钟同步服务器是ntp.ubuntu.com,Debian则是0.debian.pool.ntp.or ...
- 公司为什么要使用OKR,目的是什么?
原创不易,求分享.求一键三连 站在公司角度,会有一些诉求: 想知道每个人在干什么,干得怎么样: 想知道如何把更多的人卷起来: 人是不想被管束的,无论是想"度量我"还是想卷我,都是我 ...
- 6.Docker网络
什么是 Docker网络 docker 不启动,默认网络情况 ens33 lo virbr0 在 CentOS7 的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的 ...
- 无法启动报,To install it, you can run: npm install --save @/components/xxxx.vue
运行的过程中后台报错 npm install --save @/components/xxx.vue 重装了node_modules依然没有用. 其实是组件路径写错了 总结 以后出现提醒安装那个vue ...
- 5分钟快速搭建一个springboot的项目
现在开发中90%的人都在使用springboot进行开发,你有没有这样的苦恼,如果让你新建一个springboot开发环境的项目,总是很苦恼,需要花费很长时间去调试.今天来分享下如何快速搭建. 一 ...
- HMS Core AR Engine 2D图片/3D物体跟踪技术 助力打造更智能AR交互体验
AR技术已经被广泛应用于营销.教育.游戏.展览等场景.通过2D图像跟踪技术和3D物体跟踪技术,用户只需使用一台手机进行拍摄,即可实现海报.卡牌等平面物体以及文物.手办等立体物体的AR效果.尽管近年来2 ...
- Java开发学习(二)----IOC、DI入门案例
一.IOC入门案例 1.1 思路分析 (1)Spring是使用容器来管理bean对象的,那么管什么? 主要管理项目中所使用到的类对象,比如(Service和Dao) (2)如何将被管理的对象告知IOC ...
- mysql外键创建不成功/失效
当前mysql版本:SELECT VERSION();结果为:5.5.40. 在复习mysql外键约束时创建表格:stu与grade,目标:grade的id随着student的id级联更新,且限制删除 ...
- CabloyJS微信模块、企业微信模块已出齐
前言 当Cabloy-企业微信模块完成时,加上之前已完成的Cabloy-微信模块,关于在CabloyJS中与微信/企业微信对接的任务已经完成了.这些模块的目标就是,只需填入各类服务的参数,就可以直接进 ...
- distroless 镜像介绍及 基于cbl-mariner的.NET distroless 镜像的容器
1.概述 容器改变了我们看待技术基础设施的方式.这是我们运行应用程序方式的一次巨大飞跃.容器编排和云服务一起为我们提供了一种近乎无限规模的无缝扩展能力. 根据定义,容器应该包含 应用程序 及其 运行时 ...