FastAPI是Python Web开发的未来
作者:互联网
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语法来实现这些事情。这里有一个例子:
从fastapi导入FastAPI 应用程序 = FastAPI() @app.get("/items/{item_id}") async def read_item(item_id:int): 返回 {"item_id": item_id}
这是一个非常简单的API端点,将item_id作为输入,并以JSON格式返回。这里有趣的是,Python的提示用于验证输入。因此,如果您这样称呼这个端点:
“/项目/测试”
它将返回一个验证错误:
{ "细节":[ { "loc":[ "路径", "item_id" ], "msg": "值不是有效的整数", "type": "type_error.integer" } 】 }
但是,如果你需要比这更复杂的东西呢?
Pydantic
使用Python类型注释进行数据验证和设置管理。pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误。定义数据在纯规范的Python中应该如何;用pydantic验证它。
以下是在FastAPI应用程序中使用Pydantic的示例:
从打字进口联盟 从fastapi导入FastAPI 从pydantic导入BaseModel 类项目(BaseModel): 名称:str 描述:Union[str, None] = None 价格:浮动 税收:联盟[浮动,无] = 无 应用程序 = FastAPI() @app.post("/items/") async def create_item(项目:项目): 退货商品
仍然可以使用内置类型提示。以及Pydantic模型本身使用类型提示来描述字段。如果你只使用Django和Flask等框架,这应该已经让你感到惊讶了。
让我们看看使用Django REST Framework的序列化器来实现相同结果的示例:
类CommentSerializer(serializers.Serializer): name = serializers.CharField(最大长度=200) 描述= serializers.CharField(最大长度=500,必填=错误) 价格 = serializers.FloatField() tax = serializer.FloatField(必填=False)
这是DRF序列化器的简单例子,当然,它正在工作,但Pydantic的版本是一种更干净、更python的方式。
序列化更简单,我们只需从路径操作函数返回Pydantic模型的实例,它将自动与所有嵌套模型一起序列化。
自动文档
FastAPI将根据您的类型提示、Pydantic模型和路径操作函数的参数生成OpenAPI模式,并将显示在交互式API文档中。
FastAPI提供了大量机会根据您的需求修改和配置文档。您可以使用干净的语法添加描述、评论、标题、示例以及您能想到的一切。
编辑支持
此功能是上述要点的影响。
乍一看,编辑支持听起来可能毫无用处,但相信我——这是大型项目的实时节省。当您的项目不断增长时,您应该将数据模型与业务逻辑以及端点分开(我希望您这样做),所以编辑器已经知道您的模型有哪些类型的属性,这非常酷,因此您将在编码时避免很多愚蠢的错误。人们往往低估了这一点,但当你将一个小错误推入生产中时,它可能会成为现实,使用编辑器高亮显示可以避免。
依赖注入
在软件工程中,依赖注入是一种设计模式,其中对象或函数接收它所依赖的其他对象或函数。一种控制反转形式,依赖注入旨在将构建对象和使用对象的关注分开,从而导致松散耦合的程序。
依赖注入是其他编程语言中广泛使用的设计模式,但在Python中不是。它来自完整的OOP语言,如Java和。NET,所以你可能甚至不熟悉它,但你觉得呢?它也是一个救星。
让我们看看它在FastAPI中是如何工作的。
要实现DI,我们需要有一个“可依赖的”,在FastAPI中,每个函数(同步或异步)都可以接受路径操作函数可以采取的所有相同参数。
从打字进口联盟 从fastapi导入依赖,FastAPI 应用程序 = FastAPI() async def common_parameters( q:Union[str,None] = None,跳过:int = 0,limit:int = 100 ): return {"q": q, "skip": skip, "limit": limit} @app.get("/items/") async def read_items(commons: dict = Depends(common_parameters)): 返回公域 @app.get("/users/") async def read_users(commons: dict = Depends(common_parameters)): 返回公域
在这里,common_parameters是可靠的,read_items,read_users是依赖者。
在执行read_items的代码之前,将执行common_parameters。
您可以在一个函数中使用多个依赖项,并且可依赖项也可以具有依赖项,因此基本上您可以构建它们的树来满足您的需求。
对我来说,有趣的是,您根本不需要担心您可靠的参数。即使父级无法访问,FastAPI也会自动将正确的参数传递给您的函数。请参阅此示例:
从打字进口联盟 从fastapi导入依赖,FastAPI,Cookie 应用程序 = FastAPI() async def common_parameters( q:Union[str,None] = None,跳过:int = 0,limit:int = 100 ): return {"q": q, "skip": skip, "limit": limit} def check_cookies(ads_id: Union[str, None] = Cookie(default=None)): 返回 {"ads_id": ads_id} @app.get("/items/") async def read_items( commons: dict = Depends(common_parameters), cookie: dict = Depends(check_cookies) ): 返回公域
read_items函数对cookie本身一无所知,因为我们没有指定该参数,但可靠的函数仍然能够访问该cookie。这也是FastAPI的一个非常强项,因为它有助于保持代码更加干净和专业,并且仍然尽可能遵循使用python内置语法的规则。
干净的代码
上述所有要点本身都很棒,但最重要的是,它们正在导致(如果不是强迫的话)清理代码习惯。我见过python开发人员甚至不知道什么是类型注释以及我们为什么需要它们,我见过很多应用程序有很多重复的代码。FastAPI强制要求编写类型提示、声明依赖项并遵循OOP设计模式,这有助于创建出色的代码结构并保持代码的清洁。这就是为什么它现在如此受欢迎,我觉得它会留下来。