fastapi

Python 2025-08-23

fastapi框架,高性能,易于学习,快速地编码,准备生产

测试


文档:https://fastapi.tiangolo.com

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


fastapi是一个现代快速(高性能),网络框架,用于基于标准Python型提示,用于使用Python构建API。

关键功能是:

  • 快速:非常高的性能,与Nodejs同在并进行(感谢《星际和Pydantic》)。最快的Python框架之一。
  • 快速到达代码:将开发功能的速度提高约200%至300%。 *
  • 较少的错误:减少约40%的人(开发人员)诱发错误。 *
  • 直观:出色的编辑支持。到处完成。更少的时间调试。
  • 容易:易于使用和学习。更少的时间阅读文档。
  • 简短:最小化代码重复。每个参数声明中的多个功能。更少的错误。
  • 强大:获取生产准备代码。使用自动交互式文档。
  • 基于标准:基于(并完全兼容)API的开放标准:OpenAPI(以前称为Swagger)和JSON Schema。

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

赞助商

其他赞助商

意见

[...]这些天我正在使用fastapi 。[...]我实际上打算将其用于Microsoft的所有团队的ML服务。其中一些正在集成到核心Windows产品和一些办公产品中。

Kabir Khan -Microsoft (参考)

我们采用了fastapi库来催生一个可以查询以获取预测的REST服务器。[对于Ludwig]

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

Netflix很高兴地宣布我们的危机管理编排框架的开源发布: Dispatch ![使用fastapi ]建造””

凯文·格里森(Kevin Glisson),马克·维拉诺瓦(Marc Vilanova),森林蒙森 - Netflix (参考)

我对fastapi感到兴奋。太有趣了!

Brian Okken -Python Bytes Podcast主持人(参考)

老实说,您所建造的东西看起来超级稳固和抛光。从很多方面来说,这就是我想要拥抱的东西 - 看到某人建造它确实令人鼓舞。

蒂莫西·克罗斯利(Timothy Crosley) -拥抱创作者(参考)

如果您想学习一个现代构建REST API的框架,请查看fastapi [...]它很快,易于使用且易于学习[...]

我们已切换到fastapi for我们的API [...]我想您会喜欢它[...]

Ines Montani -Matthew Honnibal-爆炸AI创始人 - Spacy Creators (Ref) - (参考)

如果有人希望构建生产Python API,我强烈推荐fastapi 。它设计精美易于使用高度扩展,它已成为我们API首次开发策略的关键组成部分,并且正在推动许多自动化和服务,例如我们的虚拟TAC工程师。

Deon Pillsbury -Cisco (参考)

Typer ,Clis的fastapi

如果要构建一个CLI应用程序,该应用程序用于终端而不是Web API,请查看Typer

Typer是fastapi的小兄弟姐妹。它的目的是成为克里斯的fastapi 。 ⌨️

要求

fastapi站在巨人的肩膀上:

  • 网络零件的星条。
  • 数据部分的Pydantic。

安装

创建并激活虚拟环境,然后安装fastapi :

fastapi[standard]" ---> 100%">
$ pip install " fastapi [standard] "

---> 100%

注意:确保将“ fastapi [Standard]”放在引号中,以确保其在所有终端中工作。

例子

创建它

使用以下方式创建一个文件main.py

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}">
 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 def:

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}">
 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 }

笔记

如果您不知道,请检查“快点?”关于异步和文档中等待的部分。

运行它

使用以下方式运行服务器

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 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 ...

Command 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:

  • 路径/和 /atem /{item_id}中接收HTTP请求。
  • 这两条路径都采用操作(也称为HTTP方法)。
  • 路径/item /{item_id}具有一个应为int的路径参数item_id。
  • 路径/项目 /{item_id}具有可选的STR查询参数q。

交互式API文档

现在访问http://127.**0.*0.1:8000/docs。

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

替代API文档

现在,请访问http://127.**0.*0.1:8000/redoc。

您将看到替代自动文档(由RETOC提供):

示例升级

现在,修改文件main.py以从PUT请求接收正文。

借助Pydantic,使用标准Python类型声明身体。

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}">
 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文档将自动更新,包括新主体:
  • 单击按钮“尝试出去”,它允许您填充参数并直接与API交互:
  • 然后单击“执行”按钮,用户界面将与您的API通信,发送参数,获取结果并在屏幕上显示它们:

替代API文档升级

现在,请访问http://127.**0.*0.1:8000/redoc。

  • 替代文档还将反映新的查询参数和主体:

回顾

总而言之,您参数,主体等的类型声明为函数参数。

您可以使用标准的现代Python类型来做到这一点。

您不必学习新的语法,特定库的方法或类别等。

只是标准python

例如,对于INT:

 item_id : int

或更复杂的项目模型:

 item : Item

...随着您获得的单一声明:

  • 编辑支持,包括:
    • 完成。
    • 类型检查。
  • 数据验证:
    • 当数据无效时,自动且清晰的错误。
    • 甚至针对深嵌套的JSON对象的验证。
  • 输入数据的转换:从网络转到Python数据和类型。从:
    • JSON。
    • 路径参数。
    • 查询参数。
    • 曲奇饼。
    • 标题。
    • 表格。
    • 文件。
  • 输出数据的转换:从Python数据和类型转换为网络数据(作为JSON):
    • 转换Python类型(STR,INT,Float,Bool,List等)。
    • DateTime对象。
    • UUID对象。
    • 数据库模型。
    • ...还有更多。
  • 自动交互式API文档,包括2个替代用户界面:
    • Swagger UI。
    • 重做。

回到上一个代码示例, fastapi将:

  • 验证是否有一个item_id在获取和提出请求的路径中。
  • 验证item_id是int type int for get和put请求。
    • 如果不是这样,客户将看到一个有用的,清晰的错误。
  • 检查是否有一个名为Q的可选查询参数(如http://127.**0.*0.1:8000/items/foo?q=somequery)以获取get requests。
    • 由于Q参数用= none声明,因此是可选的。
    • 没有任何不需要的就需要(与put的身体一样)。
  • 对于将请求到 /item /{item_id}的请求,请将其读为JSON:
    • 检查它具有所需的属性名称,该名称应为str。
    • 检查它具有所需的属性价格,必须是浮点。
    • 检查它是否具有可选的属性iS_offer,如果存在,应该是一个布尔。
    • 所有这些也适用于深嵌套的JSON对象。
  • 自动转换为JSON。
  • 用OpenAPI记录所有内容,可以通过以下方式使用:
    • 交互式文档系统。
    • 许多语言的自动客户端代码生成系统。
  • 直接提供2个交互式文档Web接口。

我们只是刮擦了表面,但是您已经了解了一切的工作方式。

尝试使用以下方式更改行:

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

...从:

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

...到:

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

...并查看您的编辑器将如何自动完成属性并了解其类型:

有关包括更多功能的更完整的示例,请参见教程 - 用户指南。

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

  • 从其他不同位置声明参数为:标题cookie表单字段文件
  • 如何将验证约束设置为最大_length或Regex。
  • 一个非常强大且易于使用的依赖注入系统。
  • 安全性和身份验证,包括对JWT令牌HTTP Basic Auth的OAuth2的支持。
  • 对于宣布深嵌套的JSON模型(感谢Pydantic),更先进的技术(但同样容易)。
  • GraphQL与草莓和其他库集成。
  • 许多额外功能(多亏了《星条》)为:
    • Websocket
    • 基于HTTPX和PYTEST的非常简单的测试
    • 科尔斯
    • 饼干会议
    • ...还有更多。

表现

独立的Techempower基准测试显示了在Uvicorn下运行的fastapi应用程序是最快的Python框架之一,仅在星际和Uvicorn本身下方(由fastapi内部使用)。 (*)

要了解有关它的更多信息,请参见“基准”部分。

依赖性

fastapi取决于Pydantic和starlette。

标准依赖性

当您使用PIP安装“ fastapi [Standard]”安装fastapi时,它将随附标准的可选依赖项组:

Pydantic使用:

  • 电子邮件validator-用于电子邮件验证。

由星条:

  • HTTPX-如果要使用测试量,则需要。
  • jinja2-如果要使用默认模板配置,则需要。
  • Python -Multipart-如果要支持“解析”,则需要request.form()。

fastapi使用:

  • Uvicorn-对于加载和服务您应用程序的服务器。这包括UVICORN [Standard],其中包括一些依赖性(例如UVloop),需要进行高性能服务。
  • fastapi -cli [standard] - 提供fastapi命令。
    • 这包括fastapi -Cloud -CLI,它允许您将fastapi应用程序部署到fastapi Cloud。

没有标准依赖性

如果您不想包含标准的可选依赖项,则可以使用PIP安装fastapi安装,而不是PIP安装“ fastapi [Standard]”。

没有fastapi -cloud -cli

如果要以标准依赖项安装fastapi ,但是没有fastapi -Cloud-CLI,则可以使用PIP安装安装“ fastapi [standard-no- fastapi -cloud-cli]”。

其他可选依赖性

您可能需要安装一些其他依赖项。

其他可选的pydantic依赖性:

  • Pydantic -Settings-用于设置管理。
  • pydantic-extra-types-用于与Pydantic一起使用的额外类型。

其他可选的fastapi依赖性:

  • ORJSON-如果要使用OrjsonResponse,则需要。
  • UJSON-如果要使用Ujsonresponse,则需要。

执照

该项目是根据MIT许可证的条款获得许可的。

下载源码

通过命令行克隆项目:

git clone https://github.com/fastapi/fastapi.git