跳转到主要内容

FastAPI 框架,现代、快速(高性能)、易于学习,快速编码,适用于生产

项目描述

FastAPI

FastAPI 框架,现代、快速(高性能)、易于学习,快速编码,适用于生产

Test Coverage Package version Supported Python versions


文档: https://fastapi.org.cn

源代码: https://github.com/fastapi/fastapi


FastAPI 是一个基于标准 Python 类型提示的现代、快速(高性能)Web 框架,用于使用 Python 构建 API。

其主要特性包括

  • 快速:非常高的性能,与 NodeJSGo 相当(得益于 Starlette 和 Pydantic)。是市面上最快的 Python 框架之一
  • 快速编码:提高开发特性的速度约 200% 到 300%。*
  • 更少错误:减少约 40% 的人为(开发者)错误。*
  • 直观:优秀的编辑器支持。自动完成无处不在。更少的时间用于调试。
  • 简单:设计用于易于使用和学习。更少的时间阅读文档。
  • 简洁:最小化代码重复。每个参数声明都包含多个功能。更少错误。
  • 健壮:获得可用于生产的代码。带有自动交互式文档。
  • 基于标准:基于(并完全兼容)API 的开放标准:OpenAPI(以前称为 Swagger)和 JSON Schema

* 基于内部开发团队构建生产应用程序的测试估计。

赞助商

其他赞助商

观点

"[...] 我最近一直在大量使用 FastAPI。[...] 我实际上计划将其用于微软团队的全部 ML 服务。其中一些将集成到核心 Windows 产品和一些 Office 产品中。"

Kabir Khan - 微软 (参考)

"我们采用了 FastAPI 库来生成一个 REST 服务器,可以查询以获得 预测。[用于 Ludwig]"

Piero Molino, Yaroslav Dudin, 和 Sai Sumanth Miryala - Uber (参考)

"Netflix 欣喜地宣布我们危机管理编排框架的开源发布:Dispatch![使用 FastAPI 构建]"

Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (参考)

"我对 FastAPI 非常兴奋。它很有趣!"


"说实话,你所构建的看起来非常坚固和精致。在许多方面,这正是我想要的 Hug。看到有人构建这样的东西,真是令人鼓舞。"

Timothy Crosley - Hug 创始人 (参考)

"如果你正在寻找一个用于构建 REST API 的现代框架,请看看 FastAPI [...] 它很快,使用和学习的难度都很低 [...] "

"我们已经将我们的 API 切换到 FastAPI [...] 我认为你会喜欢它 [...] "

Ines Montani - Matthew Honnibal - Explosion AI 创始人 - spaCy 创作者 (参考) - (参考)

"如果你正在寻找一个用于构建生产 Python API 的框架,我强烈推荐 FastAPI。它设计得非常 美观易于使用,并且 高度可扩展,已经成为我们 API 首选开发策略的关键组成部分,并推动了许多自动化和服务,如我们的虚拟 TAC 工程师。"

Deon Pillsbury - Cisco (参考)

Typers,CLI 的 FastAPI

如果你正在构建一个用于终端而不是 Web API 的 CLI 应用程序,请查看 Typers

Typers 是 FastAPI 的小兄弟。它的目的是成为 CLI 的 FastAPI。⌨️ 🚀

要求

FastAPI 立于巨人之肩

安装

创建并激活一个 虚拟环境,然后安装 FastAPI。

$ pip install "fastapi[standard]"

---> 100%

注意:请确保将 "fastapi[standard]" 用引号括起来,以确保在所有终端中都能正常工作。

示例

创建它

  • 创建一个名为 main.py 的文件,内容如下:
from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}
或者使用 async def...

如果你的代码使用了 async / await,则使用 async def

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

注意:

如果你不清楚,可以查看文档中关于 asyncawait 的“急忙?”部分。

运行它

使用以下命令运行服务器:

$ fastapi dev main.py

 ╭────────── FastAPI CLI - Development mode ───────────╮
 │                                                     │
 │  Serving at: http://127.0.0.1:8000                  │
 │                                                     │
 │  API docs: http://127.0.0.1:8000/docs               │
 │                                                     │
 │  Running in development mode, for production use:   │
 │                                                     │
 │  fastapi run                                        │
 │                                                     │
 ╰─────────────────────────────────────────────────────╯

INFO:     Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [2248755] using WatchFiles
INFO:     Started server process [2248757]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
关于命令 fastapi dev main.py...

命令 fastapi dev 会读取你的 main.py 文件,检测其中的 FastAPI 应用,并使用 Uvicorn 启动服务器。

默认情况下,fastapi dev 会启用自动重新加载,以适应本地开发。

你可以在 FastAPI CLI 文档 中了解更多信息。

检查它

在浏览器中打开 http://127.0.0.1:8000/items/5?q=somequery

你将看到如下 JSON 响应:

{"item_id": 5, "q": "somequery"}

你已经创建了一个 API,该 API

  • 接收在 paths //items/{item_id} 中的 HTTP 请求。
  • 这两个 paths 都使用了 GET 操作(也称为 HTTP 方法)。
  • 路径 /items/{item_id} 有一个 路径参数 item_id,它应该是一个 int
  • 路径 /items/{item_id} 有一个可选的 str 查询参数 q

交互式 API 文档

现在转到 http://127.0.0.1:8000/docs

你将看到自动的交互式 API 文档(由 Swagger UI 提供)

Swagger UI

替代 API 文档

现在转到 http://127.0.0.1:8000/redoc

你将看到替代的自动文档(由 ReDoc 提供)

ReDoc

示例升级

现在修改 main.py 文件以接收来自 PUT 请求的正文。

使用 Pydantic 声明正文,感谢 Pydantic。

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Union[bool, None] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

fastapi dev 服务器应该会自动重新加载。

交互式 API 文档升级

现在转到 http://127.0.0.1:8000/docs

  • 交互式 API 文档将自动更新,包括新的正文。

Swagger UI

  • 点击“试一试”按钮,它允许你填写参数并直接与 API 交互

Swagger UI interaction

  • 然后点击“执行”按钮,用户界面将与你的 API 通信,发送参数,获取结果并在屏幕上显示

Swagger UI interaction

替代 API 文档升级

现在转到 http://127.0.0.1:8000/redoc

  • 替代文档也会反映新的查询参数和正文

ReDoc

总结

总之,你只需 一次 声明参数、正文等类型的函数参数。

你将使用标准的现代 Python 类型来完成此操作。

你不必学习新的语法、特定库的方法或类等。

只是标准的 Python

例如,对于 int

item_id: int

或者对于更复杂的 Item 模型

item: Item

...通过这个单次声明,你将获得

  • 编辑器支持,包括
    • 自动完成。
    • 类型检查。
  • 数据验证
    • 数据无效时自动和清晰的错误。
    • 即使是深度嵌套的 JSON 对象也能进行验证。
  • 输入数据转换:从网络到 Python 数据和类型的转换。从
    • JSON。
    • 路径参数。
    • 查询参数。
    • Cookie。
    • 请求头。
    • 表单。
    • 文件。
  • 输出数据转换:从Python数据和类型转换为网络数据(如JSON)
    • 转换Python类型(strintfloatboollist等)。
    • datetime对象。
    • UUID对象。
    • 数据库模型。
    • ……以及更多。
  • 自动交互式API文档,包括2个用户界面
    • Swagger UI。
    • ReDoc。

回到之前的代码示例,FastAPI将会

  • 验证GET和PUT请求中路径是否存在item_id
  • 验证GET和PUT请求中的item_id类型为int
    • 如果不是,客户端将看到有用且清晰的错误。
  • 检查是否存在名为q的可选查询参数(如在http://127.0.0.1:8000/items/foo?q=somequery中)。
    • 由于q参数声明为= None,它是可选的。
    • 没有None则是必需的(如PUT请求中的主体)。
  • 对于向/items/{item_id}的PUT请求,将主体作为JSON读取
    • 检查是否存在必需属性name,它应该是一个str
    • 检查是否存在必需属性price,它必须是一个float
    • 检查是否存在可选属性is_offer,它应该是一个bool,如果存在的话。
    • 所有这些对于深层嵌套的JSON对象也适用。
  • 自动进行JSON的转换。
  • 使用OpenAPI记录一切,这可以被交互式文档系统使用
    • 自动客户端代码生成系统,支持多种语言。
    • 直接提供2个交互式文档Web界面。
  • 我们只是触及了表面,但你已经对它是如何工作的有了概念。

尝试更改以下行

...

    return {"item_name": item.name, "item_id": item_id}

从...

        ... "item_name": item.name ...

到...

        ... "item_price": item.price ...

并看看你的编辑器将如何自动完成属性并知道它们的类型

editor support

要查看一个更完整的示例,包括更多功能,请参阅教程 - 用户指南

剧透警告:教程 - 用户指南包括

  • 从其他不同位置声明参数,例如:请求头Cookie表单字段文件
  • 如何设置maximum_lengthregex之类的验证约束
  • 一个功能强大且易于使用的Dependency Injection系统。
  • 安全和认证,包括对OAuth2JWT令牌以及HTTP Basic认证的支持。
  • 声明深层嵌套JSON模型的更多高级(但同样简单)技术(感谢Pydantic)。
  • Strawberry和其他库的GraphQL集成。
  • 许多额外功能(感谢Starlette),例如
    • WebSockets
    • 基于HTTPX和pytest的极其简单的测试
    • CORS
    • Cookie会话
    • ……等等。

性能

独立的TechEmpower基准测试表明,运行在Uvicorn下的FastAPI应用程序是可用的Python框架中最快的之一,仅低于Starlette和Uvicorn本身(FastAPI内部使用)。(*)

要了解更多信息,请参阅基准测试部分。

依赖项

FastAPI依赖于Pydantic和Starlette。

standard依赖项

当你使用pip install "fastapi[standard]"安装FastAPI时,它会包含standard组的可选依赖项

由Pydantic使用

被 Starlette 使用

  • httpx - 如果你想使用 TestClient,则必需。
  • jinja2 - 如果你想要使用默认模板配置,则必需。
  • python-multipart - 如果你想要支持表单的 "解析" ,使用 request.form(),则必需。

被 FastAPI / Starlette 使用

  • uvicorn - 用于加载和提供你的应用程序的服务器。这包括 uvicorn[standard],它包括一些用于高性能提供的依赖项(例如 uvloop)。
  • fastapi-cli - 提供了 fastapi 命令。

standard 依赖项

如果你不想包括 standard 可选依赖项,可以使用 pip install fastapi 而不是 pip install "fastapi[standard]" 进行安装。

额外的可选依赖项

还有一些额外的依赖项你可能想要安装。

额外的可选 Pydantic 依赖项

额外的可选 FastAPI 依赖项

  • orjson - 如果你想要使用 ORJSONResponse,则必需。
  • ujson - 如果你想要使用 UJSONResponse,则必需。

许可证

本项目受 MIT 许可证的条款约束。

项目详情


发布历史 发布通知 | RSS 源

下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

fastapi-0.115.0.tar.gz (302.3 kB 查看散列值)

上传时间 源代码

构建分发

fastapi-0.115.0-py3-none-any.whl (94.6 kB 查看散列值)

上传时间 Python 3

由以下机构支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面