Fastapi框架:Starlette,Pydantic 与 FastAPI 框架是什么关系?

发布时间 2023-11-16 21:50:13作者: wwwxxx123

【一】介绍

  • Starlette 是个什么项目;
  • IDE 开发时 Python 3.5+ 版本的 "type hints" 的好处:简短、直观和标准的 Python 类型声明;
  • 介绍 Pydantic 包,FastAPI 项目的开发为什么要使用 Pydantic

【二】Starlette

【1】介绍

  • Starlette 是一种轻量级的 ASGI 框架/工具包,是构建高性能 Asyncio 服务的理想选择
  • Starlette 是一个轻量级的异步Web框架,用于构建高性能、可扩展和易维护的Web应用程序,特别适用于Python的异步编程环境。

【2】特点

1. 异步支持: Starlette是基于Python的asyncio库构建的,因此完全支持异步编程。这使得它在处理高并发和I/O密集型任务时表现出色,特别适用于构建实时Web应用、API、聊天应用等。

2. 轻量级: Starlette的设计目标之一是保持简单和轻量级。它提供了一组基本但强大的工具,以便于构建Web应用,而无需引入过多的复杂性或不必要的功能。

3. 中间件支持: Starlette支持中间件,允许你在请求和响应处理流程中添加自定义功能。这使得你可以轻松地添加认证、日志记录、异常处理等功能,以满足应用程序的需求。

4. 路由系统: Starlette提供了灵活的路由系统,可以根据URL模式将请求路由到相应的处理函数。这使得你能够定义RESTful API、网页路由等,以构建多样化的应用。

5. 异常处理: Starlette内置了异常处理机制,可以捕获和处理应用程序中的异常。这有助于提高应用的稳定性和可维护性。

6. WebSocket支持: Starlette支持WebSocket协议,允许你构建实时双向通信的应用程序,如聊天室、通知系统等。

7. 内置服务器支持: Starlette可以与ASGI(Asynchronous Server Gateway Interface)服务器一起使用,例如Uvicorn和Hypercorn,以便部署和运行应用程序。

8. 大量扩展库: Starlette拥有丰富的生态系统,有许多与它兼容的扩展库,例如FastAPI、Tortoise-ORM等,可以帮助你更快地构建和扩展应用程序。

9. 文档和社区: Starlette有详细的文档和一个积极的开源社区,你可以在社区中获取支持和贡献代码。

  • 总的来说,Starlette是一个功能强大且易于使用的Web框架,特别适用于构建现代的异步Web应用程序。
  • 它的轻量级和灵活性使得开发者能够根据需求自定义应用,同时充分利用Python的异步编程能力。
  • 如果你需要构建高性能的Web应用或API,Starlette是一个值得考虑的选择。

【三】Pydantic

【1】引入

  • 我们在定义函数时,一般是如下定义格式
    • 在定义形参时,不对参数的类型进行多余的限制
# 定义一个函数并且不对参数的类型进行限制
def get_name_woth_age(name, age):
    print(name, age)
  • 当我们想对我们的参数进行限制时,我们可以使用一些内置的参数类型进行限制
# 定义一个函数并对参数的类型进行限制 --- python自带的数据类型
def get_name_woth_age(name: str, age: int):
    print(name, age)
  • 我们也可以自定义限制类型,并使用
# 定义一个函数并对参数的类型进行自定义限制 --- python自带的数据类型
class NotNull():
    ...


def get_name_woth_age(name: NotNull, age: int):
    print(name, age)
  • 我们可以使用python自带的内置包 typing 对我们的参数进行严格的限制
# 对参数的类型加更多的限制 (列表/字典等)
from typing import List, Set, Tuple, Dict


# 限制列表内的元素类型为 字符串类型
# 限制字典内的键为字符串类型,值为浮点型
def process_time(items: List[str], dict_items: Dict[str, float]):
    for item in items:
        # 在这里我们可以调用字符串的相关方法,因为我们已经提前对列表内的元素类型加了限制
        print(item)
  • 以上的方式,相对来说都比较复杂,因此有人为我们写好了一个库,就是Pydantic
  • Pydantic 是一个基于 Python 类型提示来定义数据验证、序列化和文档(使用JSON模式的)库

【2】详解

  • Pydantic 是一个Python库,用于数据验证和解析。
  • 它的主要目标是使数据验证变得简单且易于维护。

【3】Pydantic 的特点包括

1. 基于类型注解: Pydantic 使用Python的类型注解来定义数据模型,使得代码更具可读性和可维护性。你可以通过定义数据模型来指定输入数据的期望类型。

2. 数据验证: Pydantic 自动验证输入数据是否符合定义的模型规范,包括数据类型、长度、范围等。如果数据不符合规范,Pydantic 将引发异常,使得数据输入更加安全。

3. 数据解析: Pydantic 能够将原始数据解析成Python对象,以便于进一步处理。这样可以将输入数据转化为应用程序内部的数据结构,从而简化数据处理逻辑。

4. 自动生成文档: Pydantic 可以根据数据模型自动生成文档,包括字段名称、数据类型、默认值等信息。这有助于生成API文档或数据表单,提高了文档的准确性。

5. 默认值和可选项: 你可以为字段指定默认值,并将字段标记为可选项(optional),这使得在数据模型中定义可选参数变得容易。

6. 数据转换: Pydantic 支持数据转换功能,可以将输入数据从一种类型转换为另一种类型,例如将字符串转换为日期时间对象。

7. 嵌套模型: 你可以创建嵌套的数据模型,以处理复杂的数据结构。这有助于将数据整理成更有组织的形式。

8. 支持Python类型: Pydantic 支持各种Python内置类型,如int、str、bool、datetime等,以及自定义类型。

9. 异步验证: Pydantic 支持异步验证和解析,适用于异步应用程序。

【4】Pydantic的基本用法示例

from pydantic import BaseModel

class User(BaseModel):
    username: str
    email: str
    age: int

# 创建一个用户对象
user_data = {
    "username": "john_doe",
    "email": "john@example.com",
    "age": 30
}

user = User(**user_data)

# 数据验证和解析
print(user.username)  # 输出: john_doe
print(user.age)       # 输出: 30

# 无效数据将引发异常
invalid_data = {
    "username": "jane_doe",
    "email": "invalid_email",  # 无效的邮箱地址
    "age": "thirty"            # 无效的年龄
}

invalid_user = User(**invalid_data)  # 引发ValidationError异常

【总结】

  • Pydantic 是一个功能强大的数据验证和解析库,适用于各种Python应用程序,特别是用于构建API和处理用户输入数据的情况。
  • 它的类型注解、自动生成文档和数据转换功能使得开发过程更加高效和可靠。
  • Pydantic的详细文档提供了更多示例和用法说明,可供进一步学习和使用。

【四】三者之间的关系

image-20230928162630128

【补充】ASGI/WSGI

image-20230928162711161

  • ASGI(Asynchronous Server Gateway Interface)和 WSGI(Web Server Gateway Interface)都是Python Web应用程序和Web服务器之间的接口标准,它们定义了Web服务器如何与Web应用程序进行通信。
  • 不过,它们之间存在一些重要的区别。

【1】ASGI(Asynchronous Server Gateway Interface)

  • ASGI 是一个更现代、异步的接口标准,旨在支持异步Web应用程序,例如基于async/await的Python框架。
  • 它允许Web应用程序处理大量并发请求而不会阻塞,从而提高了性能和响应速度。
  • 一些常见的ASGI框架包括FastAPI、Starlette和Tornado。

【2】ASGI服务

  • Uvicorn: Uvicorn 是一个ASGI服务器,用于运行ASGI应用程序。它是一个轻量级、快速且易于部署的服务器,广泛用于FastAPI和其他ASGI框架。
  • Hypercorn: Hypercorn 也是一个ASGI服务器,与Uvicorn类似,用于运行ASGI应用程序。它具有一些额外的特性,如支持UNIX套接字(UNIX socket)。
  • Daphne: Daphne 是一个ASGI服务器,专门设计用于运行Django应用程序。它允许将Django应用程序部署为ASGI应用程序。

【3】WSGI(Web Server Gateway Interface)

  • WSGI 是一个较早的接口标准,用于同步Web应用程序。
  • 它允许Python Web应用程序与Web服务器之间进行通信,但不能有效处理异步操作。
  • 一些常见的WSGI框架包括Django、Flask和Bottle。

【4】WSGI服务

  • uWSGI: uWSGI 是一个WSGI服务器,广泛用于运行WSGI应用程序。它支持多种应用程序容器和部署模式,可以与各种Web服务器配合使用。
  • Gunicorn: Gunicorn(Green Unicorn)是一个WSGI服务器,专为Django应用程序设计。它通过多工作进程实现并发处理请求,提高了应用程序的性能。

【5】对比

主要区别在于:

  • 同步 vs. 异步: WSGI 是同步接口,适用于同步Web应用程序。ASGI 是异步接口,适用于异步Web应用程序。ASGI允许应用程序处理长连接、WebSocket等异步操作。
  • 性能: 由于ASGI的异步特性,它更适合处理大量并发请求和高性能需求。WSGI更适合传统的同步Web应用程序。
  • 框架兼容性: ASGI通常用于FastAPI、Starlette、Tornado等异步框架,而WSGI通常用于Django、Flask、Bottle等同步框架。
  • 选择ASGI还是WSGI取决于项目的需求和性能要求。
  • 如果需要处理大量并发请求或使用异步操作,ASGI可能更合适。
  • 如果项目已经使用WSGI框架并且不需要异步操作,那么继续使用WSGI是合理的选择。