FastAPI 框架,高性能、易学、快速编码、可立即投入生产
Documentation: https://fastapi.tiangolo.com
Source Code: https://github.com/fastapi/fastapi
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 构建 API。
其主要特点如下:
* 基于内部开发团队在构建生产应用程序时进行的测试进行估算。
“[...] 我最近一直在使用 FastAPI。[...] 我实际上计划将它用于我团队在微软的所有 机器学习 服务。其中一些服务正在集成到核心 Windows 产品和一些 Office 产品中。”
“我们采用了 FastAPI 库来生成一个 REST 服务器,可以通过查询该服务器来获取 预测。[致 Ludwig]”
“Netflix 非常高兴地宣布开源我们的危机管理编排框架:Dispatch![基于 FastAPI 构建]”
“我对 FastAPI 感到非常兴奋。它太好玩了!”
“_说实话,你构建的东西看起来超级扎实精致。从很多方面来说,它正是我想要的 Hug 的样子——看到有人能做出这样的作品,真的很鼓舞人心。”
“如果您想学习一个用于构建 REST API 的现代框架,请查看 FastAPI [...] 它速度快、易于使用且易于学习 [...]”
“我们已经将 API 切换到 FastAPI [...] 我相信您会喜欢它 [...]”
“_如果有人想构建生产级 Python API,我强烈推荐 FastAPI。它设计精美、易于使用且高度可扩展,已成为我们 API 优先开发策略的关键组件,并正在驱动许多自动化和服务,例如我们的虚拟 TAC 工程师。”
如果您正在构建一个CLI应用,用于终端而非 Web API,请查看Typer。
Typer 是 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}
注意:
如果您不清楚,请查看文档中关于async
和 await
的“急着用吗?”部分。
使用以下命令运行服务器:
$ 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,它:
/
和 /items/{item_id}
中的 HTTP 请求。GET
操作(也称为 HTTP 方法)。/items/{item_id}
有一个 _path 参数 item_id
,该参数应为 int
。/items/{item_id}
有一个可选的 str
查询参数 q
。现在访问 http://127.0.0.1:8000/docs。
您将看到自动生成的交互式 API 文档(由 Swagger UI 提供):
现在,访问 http://127.0.0.1:8000/redoc。
您将看到另一个自动文档(由 ReDoc 提供):
现在修改 main.py
文件,使其能够接收 PUT
请求的主体。
使用标准 Python 类型声明主体,感谢 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
服务器应该自动重新加载。
现在访问 http://127.0.0.1:8000/docs。
现在,请访问 http://127.0.0.1:8000/redoc。
总而言之,您只需一次将参数、主体等的类型声明为函数参数即可。
您可以使用标准的现代 Python 类型来做到这一点。
您无需学习新的语法、特定库的方法或类等。
只需使用标准的Python即可。
例如,对于 int
类型:
item_id: int
或者对于更复杂的“Item”模型:
item: Item
...只需这一个声明,您就可以获得:
str
、int
、float
、bool
、list
等)。datetime
对象。UUID
对象。回到前面的代码示例,FastAPI 将:
GET
和 PUT
请求的路径中是否存在 item_id
。GET
和 PUT
请求的 item_id
类型是否为 int
。GET
请求中是否存在名为 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
(如果存在)。我们只是略知皮毛,但您已经大致了解它的工作原理了。
尝试将以下代码改为:
return {"item_name": item.name, "item_id": item_id}
...from:
... "item_name": item.name ...
...to:
... "item_price": item.price ...
...看看您的编辑器如何自动补全属性并识别它们的类型:
如需查看包含更多功能的更完整示例,请参阅教程 - 用户指南。
剧透警告:本教程 - 用户指南包含以下内容:
maximum_length
或 regex
。pytest
的极其简单的测试独立的 TechEmpower 基准测试表明,在 Uvicorn 下运行的 FastAPI 应用程序是目前最快的 Python 框架之一,仅次于 Starlette 和 Uvicorn(FastAPI 内部使用)。 (*)
要了解更多信息,请参阅基准部分。
FastAPI 依赖于 Pydantic 和 Starlette。
standard
依赖项使用 pip install "fastapi[standard]"
安装 FastAPI 时,它会附带 standard
一组可选依赖项:
Pydantic 使用:
email-validator
- 用于电子邮件验证。Starlette 使用:
httpx
- 如果要使用 TestClient
,则需要此依赖项。jinja2
- 如果您想使用默认模板配置,则需要此组件。python-multipart
- 如果您想使用 request.form()
支持表单“解析”,则需要此组件。FastAPI 使用:
uvicorn
- 用于加载和服务您的应用程序的服务器。这包括 uvicorn[standard]
,它包含一些高性能服务所需的依赖项(例如 uvloop
)。fastapi-cli[standard]
- 用于提供 fastapi
命令。fastapi-cloud-cli
,它允许您将 FastAPI 应用程序部署到 FastAPI Cloud。standard
依赖项如果您不想包含 standard
可选依赖项,可以使用 pip install fastapi
而不是 `pip install "fastapi[standard]" 进行安装。
fastapi-cloud-cli
如果您想安装包含标准依赖项但不包含 fastapi-cloud-cli
的 FastAPI,可以使用 `pip install "fastapi[standard-no-fastapi-cloud-cli]" 进行安装。
您可能需要安装一些其他依赖项。
其他可选的 Pydantic 依赖项:
pydantic-settings
- 用于设置管理。pydantic-extra-types
- 用于 Pydantic 使用的额外类型。其他可选的 FastAPI 依赖项:
本项目遵循 MIT 许可证。