FastAPI框架,高性能,易于学习,快速编码,适用于生产环境
项目描述
FastAPI框架,高性能,易于学习,快速编码,适用于生产环境
源代码: https://github.com/fastapi/fastapi
FastAPI 是一个基于标准 Python 类型提示的 Python API 构建的现代、快速(高性能)的 Web 框架。
其关键特性包括:
- 快速:非常高性能,与 NodeJS 和 Go 相当(得益于 Starlette 和 Pydantic)。是目前最快的 Python 框架之一。
- 快速开发:通过约 200% 到 300% 的速度提升开发功能。*
- 减少错误:减少大约 40% 的人类(开发者)引入的错误。*
- 直观:出色的编辑器支持。到处都有补全。减少调试时间。
- 简单:设计用于易于使用和学习。减少阅读文档的时间。
- 简洁:最小化代码重复。每个参数声明包含多个功能。减少错误。
- 健壮:获取可用于生产的代码。具有自动交互式文档。
- 基于标准:基于(且完全兼容)API 的开放标准:OpenAPI(之前称为 Swagger)和 JSON Schema。
* 基于对内部开发团队构建生产应用程序的测试的估计。
赞助商
观点
"[...] 我目前正在大量使用 FastAPI。 [...] 我实际上计划用它来构建我们团队在 Microsoft 的所有 ML 服务。其中一些将集成到核心 Windows 产品和一些 Office 产品中。"
"我们采用了 FastAPI 库来创建一个 REST 服务器,可以通过它获取 预测。[用于 Ludwig]"
"Netflix 很高兴宣布我们危机管理编排框架 Dispatch 的开源发布![使用 FastAPI 构建]"
"我对 FastAPI 非常兴奋!它太有趣了!"
"坦白说,你构建的看起来非常坚固和精致。在许多方面,这正是我想要 Hug 的样子 - 看到有人构建这样的事情真的令人鼓舞。"
"如果你想要学习一个用于构建 REST API 的 现代框架,请查看 FastAPI [...] 它速度快,易于使用和学习 [...]"
"我们已经将我们的 API 转移到 FastAPI [...] 我想你会喜欢的 [...]"
"如果你想要构建一个生产级的 Python API,我强烈推荐 FastAPI。它设计得非常 优雅,简单易用,并且 高度可扩展,它已成为我们 API 首选开发策略的关键组成部分,并推动了许多自动化和服务,如我们的虚拟 TAC 工程师。"
Typer,CLI 的 FastAPI
如果你正在构建一个用于终端而非 Web API 的 CLI 应用程序,请查看 Typer。
Typer 是 FastAPI 的“小兄弟”。它旨在成为 CLIs 的 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,它
- 接收位于 paths
/
和/items/{item_id}
的 HTTP 请求。 - 这两个 paths 都采用
GET
操作(也称为 HTTP 方法)。 - path
/items/{item_id}
有一个 path 参数item_id
,它应该是一个int
。 - path
/items/{item_id}
有一个可选的str
查询参数q
。
交互式 API 文档
现在转到 http://127.0.0.1:8000/docs。
你会看到自动的交互式 API 文档(由 Swagger UI 提供)
替代 API 文档
现在转到 http://127.0.0.1:8000/redoc。
你会看到由 ReDoc 提供的替代自动文档
示例升级
现在修改 main.py
文件,使其能够接收来自 PUT
请求的正文。
使用 Pydantic 声明正文,得益于标准的 Python 类型。
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: Item
...通过这个单一的声明,你将获得
- 编辑器支持,包括
- 补全。
- 类型检查。
- 数据验证
- 当数据无效时自动清除错误。
- 即使是深层嵌套的JSON对象也进行验证。
- 输入数据的转换:从网络到Python数据和类型。从
- JSON。
- 路径参数。
- 查询参数。
- Cookies。
- 头部。
- 表单。
- 文件。
- 输出数据的转换:将Python数据和类型转换为网络数据(作为JSON)
- 转换Python类型(
str
、int
、float
、bool
、list
等)。 datetime
对象。UUID
对象。- 数据库模型。
- ...以及更多。
- 转换Python类型(
- 自动交互式API文档,包括2个替代用户界面
- Swagger UI。
- ReDoc。
回到之前的代码示例,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
,如果存在的话。 - 所有这些也会为深层嵌套的JSON对象工作。
- 检查它是否具有必需的属性
- 自动从和到JSON转换。
- 使用OpenAPI记录一切,该API可以由
- 交互式文档系统使用。
- 自动客户端代码生成系统,支持许多语言。
- 直接提供2个交互式文档Web界面。
我们只是触及了表面,但你已经了解了这一切是如何工作的。
尝试更改
return {"item_name": item.name, "item_id": item_id}
...从
... "item_name": item.name ...
...到
... "item_price": item.price ...
...并看看你的编辑器如何自动补全属性以及它们的类型
对于更完整的示例,包括更多功能,请参阅教程 - 用户指南。
剧透警告:教程 - 用户指南包括
- 从其他不同位置声明参数,例如:头部、Cookies、表单字段和文件。
- 如何设置
maximum_length
或regex
之类的validation constraints
。 - 非常强大且易于使用的
Dependency Injection
系统。 - 安全和认证,包括对
OAuth2
、JWT
令牌和HTTP Basic
认证的支持。 - 声明深层嵌套JSON模型的高级(但同样简单)技术(归功于Pydantic)。
- 与Strawberry和其他库的
GraphQL
集成。 - 许多额外功能(归功于Starlette),如
- WebSockets
- 基于HTTPX和
pytest
的极其简单的测试 - CORS
- Cookie会话
- ...等等。
性能
独立的技术力量基准测试表明,在Uvicorn下运行的 FastAPI 应用程序是可用的Python框架中最快的之一,仅次于Starlette和Uvicorn自身(FastAPI内部使用)。(*)
了解更多信息,请参阅基准测试部分。
依赖关系
FastAPI依赖于Pydantic和Starlette。
标准
依赖关系
当您使用pip install "fastapi[standard]"
安装FastAPI时,它将包含标准
组可选依赖项
由Pydantic使用
email-validator
- 用于电子邮件验证。
由Starlette使用
httpx
- 如果您想使用TestClient
,则必须使用。jinja2
- 如果您想使用默认模板配置,则必须使用。python-multipart
- 如果您想支持表单"解析",则必须使用request.form()
。
由FastAPI / Starlette使用
uvicorn
- 用于加载和提供您的应用程序的服务器。这包括uvicorn[standard]
,它包括一些用于高性能服务的依赖项(例如uvloop
)。fastapi-cli
- 提供的fastapi
命令。
不包含标准
依赖关系
如果您不想包含标准
可选依赖关系,则可以使用pip install fastapi
而不是pip install "fastapi[standard]"
进行安装。
其他可选依赖关系
您可能还需要安装一些其他依赖关系。
其他可选Pydantic依赖关系
pydantic-settings
- 用于设置管理。pydantic-extra-types
- 用于与Pydantic一起使用的额外类型。
其他可选FastAPI依赖关系
许可证
本项目受MIT许可证条款约束。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装软件包的信息。