FastAPI简介
想象一下你在一家餐厅。你告诉服务员你的订单,服务员将其传达给厨房,然后把食物带回来。FastAPI 就像那个服务员。
它是一个现代的高性能网络框架,用于使用 Python 构建 API,让你的应用程序能够高效地与其他应用程序进行通信。
那么,为什么选择 FastAPI 而不是 Flask 或 Django REST?
因为 FastAPI 的速度与 Node.js 和 Go 一样快,使用 Python 类型提示进行验证,自动生成文档,并且设计上是异步的。与 Flask 相比,它开箱即用更具可扩展性。与 Django REST Framework 不同,它是极简且快速的。
在现实世界中,FastAPI 被用于生产环境中,许多公司正在构建生成式人工智能后端、微服务、机器学习模型部署,以及需要快速推进且注重代码整洁和性能的初创企业。
实现
要跟随本教程,请确保您的系统上已安装Python。您可以从 python.org 下载。
我们将使用虚拟环境(venv)来隔离依赖项——这有助于避免破坏全局包,并保持项目的整洁。
接下来,我们将使用PyCharm IDE社区版,因为社区版是免费的 :)——它提供智能代码建议、自动虚拟环境检测和内置终端,使Python开发顺畅高效。您可以从 PyCharm下载 中搜索 PyCharm社区版。
现在,让我们构建您的第一个FastAPI应用:
- 创建一个名为
fastapi_intro
的文件夹。 - 打开PyCharm并在该文件夹内创建一个新的Python项目。或者右键单击该文件夹并点击“使用PyCharm打开”,这将自动创建一个
main.py
文件。 - 在PyCharm中打开终端,通常位于屏幕的左下角,并运行:
python -m venv venv
source venv/bin/activate # 或者在Windows上使用 venv\Scripts\activate
pip install fastapi uvicorn
- 如果不存在,请创建一个名为
main.py
的文件
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "你好,FastAPI"}
- 在终端中使用以下命令运行它:
uvicorn main:app --reload
- 打开你的浏览器并访问 http://127.0.0.1:8000/docs — FastAPI 会自动生成交互式 Swagger 文档! 🎉
关于 BaseModel 的简要说明
在我们开始这个迷你项目之前,让我们理解这一行代码:
from pydantic import BaseModel
FastAPI 使用 Pydantic 进行数据验证。BaseModel 让你定义 API 期望的数据结构。当请求被发送时,FastAPI 使用该模型来:
- 验证输入(例如,检查是否为整数)
- 在 Swagger UI 中自动解析并记录它
可以把它看作是一个 Python 类,它确保你的 API 只接受干净、结构化的数据——无需手动检查!
将 BaseModel 看作是传入数据的蓝图——它告诉 FastAPI 数据应该是什么样的。就像一个带有必填字段的表单,它检查输入,如果缺少或不正确的内容,就会抛出错误。
小项目:简单计算器 API
让我们构建一个迷你计算器,包含两个 FastAPI 端点——一个用于加法,一个用于减法。
步骤:
注意: 安装正确版本的 Pydantic 非常重要,因此在进行以下步骤之前,请先安装 Pydantic 版本 2。
在您的终端中(在虚拟环境内)运行以下命令:
pip uninstall pydantic
pip install "pydantic<2.0.0"
- 更新您的
main.py
:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Numbers(BaseModel):
number_1: int
number_2: int
@app.post("/add")
def add(numbers: Numbers):
result = numbers.number_1 + numbers.number_2
return {
{
"number_1": numbers.number_1,
"number_2": numbers.number_2,
"result": str(result)
}
@app.post("/subtract")
def subtract(numbers: Numbers):
result = numbers.number_1 - numbers.number_2
return {
{
"number_1": numbers.number_1,
"number_2": numbers.number_2,
"result": str(result)
}
- 再次运行服务器:
uvicorn main:app --reload
- 使用 Swagger UI 测试两个端点,地址为 http://127.0.0.1:8000/docs。
您的输入 JSON:
{
"number_1": 10,
"number_2": 5
}
预期输出:
{
"number_1": 10,
"number_2": 5,
"result": "15"
}
如果您想深入了解上述代码,请阅读下面的内容;否则,请跳到挑战部分。
代码深入分析:
1. 深入解释(代码的功能)
这段代码使用 FastAPI 创建了一个简单的 API,暴露了两个端点:一个用于加法,一个用于减法两个数字。FastAPI()
类设置了网页应用。然后,使用 Pydantic 的 BaseModel
,定义了一个类 Numbers
,描述了输入数据的结构——期望两个整数。当对 /add
或 /subtract
发出 POST 请求时,FastAPI 会自动根据 Numbers
解析 JSON 输入,验证 number_1
和 number_2
是否都是整数,并将验证后的数据注入到相应的函数(加法或减法)中。该函数随后执行计算,并返回一个包含输入值和结果的 JSON 响应,结果以字符串形式呈现。FastAPI 还基于此设置使用 Swagger 自动生成交互式文档。
2. 类比(逐行直观理解)
可以把它想象成在数字餐厅内建立一个小型计算器。
from fastapi import FastAPI
:这就像设置前台,顾客在这里提出请求。from pydantic import BaseModel
:这就引入了一个剪贴板,我们在上面写下顾客必须填写的表单类型。app = FastAPI()
:你现在正在开餐厅,并说“我们准备好接单了!”class Numbers(BaseModel): ...
:这是顾客必须填写的表单,表示:“请给我两个整数以供计算。”@app.post("/add")
:你在柜台上挂上一个标志,上面写着“进行加法,请在这里递交你的表单。”def add(numbers: Numbers):
:厨师(你的函数)拿起表单,看到上面写的数字。result = numbers.number_1 + numbers.number_2
:厨师使用表单中的值进行计算。return {...}
:服务员递回一张整齐的收据,显示输入的数字和最终的总和。
对于/subtract
柜台也是如此——只是换了一个厨师在进行减法而不是加法。
挑战:
现在轮到你了!
创建两个新的端点:
/multiply
/divide
试着自己写出来——并在评论区分享你的版本!💬