为什么 FastAPI 是 Python Web 开发的未来
作者:互联网
FastAPI 到底是什么?
FastAPI是一个现代的,快速的(因此得名)Web框架,用于使用Python构建API。它建立在Starlette框架之上,严重依赖Python的类型注释来提供API请求和响应的快速有效的验证,序列化和文档。
FastAPI的主要功能是什么?
- 快速性能:FastAPI 使用高性能库(如 Pydantic 和 Uvicorn)构建,以实现令人难以置信的速度并处理高流量负载。
- 简单易用:FastAPI 带有一个简单直观的 API,易于学习和使用。
- 易于验证和序列化:FastAPI 使用 Python 的类型提示来自动验证 API 请求和响应,以及自动序列化和反序列化与 JSON 中的数据,从而消除了样板代码。
- 内置文档:FastAPI 自动生成交互式 API 文档,让开发者可以快速轻松地探索和测试 API。
- ASGI支持:FastAPI建立在ASGI(异步服务器网关接口)之上,允许它利用异步编程的强大功能来实现更快的性能。
- 依赖注入:FastAPI 利用 Python 的依赖注入系统自动将依赖注入到 API 端点和其他组件中,从而轻松构建复杂的应用程序。
让我们更详细地了解其中的一些。
易于验证和序列化
在我看来,这是FastAPI最伟大的部分。这里的关键是FastAPI使用内置的Python语法来实现这些事情。下面是一个示例:
from fastapi import FastAPI app = FastAPI() @app.get("/items/{item_id}") async def read_item(item_id: int): return {"item_id": item_id}
这是一个非常简单的 API 端点,它将item_id作为输入并以 JSON 格式返回。有趣的是,Python的提示用于验证输入。因此,如果您像这样调用此端点:
“/项目/测试”
它将返回验证错误:
{ “detail”: [ { “ loc”: [ “path”, “item_id” ], “msg”: “value 不是有效的整数”, “type”: “type_error.integer” } ] }
但是,如果您需要比这更复杂的东西怎么办?
皮丹蒂克
使用 Python 类型注释进行数据验证和设置管理。pydantic 在运行时强制实施类型提示,并在数据无效时提供用户友好的错误。定义数据应该如何用于纯规范的 Python;用pydantic验证它。
以下是在 FastAPI 应用程序中使用 Pydantic 的示例:
from typing import Union from fastapi import FastAPI from pydantic import BaseModel class Item(BaseModel): name: str description: Union[str, None] = None price: float tax: Union[float, None] = None app = FastAPI() @app.post("/items/") async def create_item(item: Item): return item
仍然适用于内置类型提示。以及Pydantic模型本身使用类型提示来描述字段。如果你只使用像Django和Flask这样的框架,这应该已经让你感到惊讶了。
让我们看看使用 Django REST Framework 的序列化程序来实现相同结果的示例:
class CommentSerializer(serializers.Serializer): name = serializers.CharField(max_length=200) description = serializers.CharField(max_length=500, required=False) price = serializers.FloatField() tax = serializer.FloatField(required=False)
这是DRF序列化程序的一个简单示例,当然,它正在工作,但是Pydantic的版本是一种更干净,更pythonic的方式。
序列化更简单,我们可以从路径操作函数返回 Pydantic 模型的一个实例,它将自动与所有嵌套模型一起序列化。
自动文档
FastAPI 将根据您的类型提示、Pydantic 模型和路径操作函数的参数生成 OpenAPI 模式,并将显示在交互式 API 文档中。
FastAPI 提供了大量机会根据您的需求修改和配置文档。您可以使用干净的语法添加描述、注释、标题、示例以及您能想到的所有内容。
编辑器支持
此功能是对上面列出的要点的影响。
编辑器支持乍一看可能听起来很无用,但相信我 - 这是大型项目的实时保存器。当你的项目在增长时,你应该把你的数据模型与业务逻辑和端点分开(我希望你这样做),所以编辑器已经知道你的模型具有哪些类型的属性,所以你将避免很多愚蠢的错误编码。人们倾向于低估这一点,但是当您将一个小错误推送到生产中时,它可以成为真实的事情,这可以通过编辑器突出显示来避免。
依赖注入
在软件工程中,依赖注入是一种设计模式,其中对象或函数接收它所依赖的其他对象或函数。依赖注入是一种控制反转的形式,旨在分离构造对象和使用它们的关注点,从而导致松散耦合的程序。
依赖注入是其他编程语言中广泛使用的设计模式,但在 Python 中则不是。它来自完整的OOP语言,如Java和.NET,所以你可能不熟悉它,但你怎么看?它也是救命稻草。
让我们看看它在 FastAPI 中是如何工作的。
要实现 DI,我们需要有一个“可靠的”,在 FastAPI 中,它是每个函数(同步或异步),可以采用路径操作函数可以采用的所有相同参数。
from typing import Union from fastapi import Depends, FastAPI app = FastAPI() async def common_parameters( q: Union[str, None] = None, skip: int = 0, limit: int = 100 ): return {"q": q, "skip": skip, "limit": limit} @app.get("/items/") async def read_items(commons: dict = Depends(common_parameters)): return commons @app.get("/users/") async def read_users(commons: dict = Depends(common_parameters)): return commons
在这里,common_parameters是可靠和read_items,read_users是家属。
在执行read_items“代码之前,将执行common_parameters。
您可以在一个函数中使用多个依赖项,并且 reliableable 也可以具有依赖项,因此基本上您可以构建它们的树以满足您的需求。
对我来说,有趣的是,您根本不需要担心可靠接收的参数。FastAPI 将自动负责将正确的参数传递给您的函数,即使父级无法访问它。请参阅此示例:
from typing import Union from fastapi import Depends, FastAPI, Cookie app = FastAPI() async def common_parameters( q: Union[str, None] = None, skip: int = 0, limit: int = 100 ): return {"q": q, "skip": skip, "limit": limit} def check_cookies(ads_id: Union[str, None] = Cookie(default=None)): return {"ads_id": ads_id} @app.get("/items/") async def read_items( commons: dict = Depends(common_parameters), cookie: dict = Depends(check_cookies) ): return commons
read_items函数对 cookie 本身一无所知,因为我们没有指定该参数,但可靠的函数仍然能够访问该 cookie。这也是 FastAPI 的一个非常强项,因为它有助于保持代码更加干净和专业,并且仍然遵循尽可能使用 python 内置语法的规则。
干净的代码
以上所有观点本身都很棒,但最重要的部分是它们正在引导(如果不是强制)清理代码习惯。我见过 python 开发人员甚至不知道什么是类型注释以及为什么我们需要它们,我见过很多应用程序有很多重复的代码。FastAPI 强制要求编写类型提示、声明依赖项并遵循 OOP 设计模式,这有助于创建出色的代码结构并保持代码干净。这就是为什么它现在如此受欢迎,我觉得它将继续存在。