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

为什么 FastAPI 是 Python Web 开发的未来

作者:互联网

FastAPI 到底是什么?

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

FastAPI的主要功能是什么?

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

易于验证和序列化

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

标签:FastAPI,Python,cookie
来源: