编程语言
首页 > 编程语言> > FastAPI是Python Web开发的未来

FastAPI是Python Web开发的未来

作者:互联网

FastAPI是一个现代、快速(因此得名)的Web框架,用于使用Python构建API。它建立在Starlette框架之上,严重依赖Python的类型注释来提供API请求和响应的快速高效的验证、序列化和文档。

FastAPI的主要特点是什么?

让我们更详细地了解其中一些。

易于验证和序列化

在我看来,这是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设计模式,这有助于创建出色的代码结构并保持代码的清洁。这就是为什么它现在如此受欢迎,我觉得它会留下来。

标签:Python, Pydantic, 异步编程
来源: