快速入门FastAPI:Python初学者指南

FastAPI简介

想象一下你在一家餐厅。你告诉服务员你的订单,服务员将其传达给厨房,然后把食物带回来。FastAPI 就像那个服务员。

它是一个现代的高性能网络框架,用于使用 Python 构建 API,让你的应用程序能够高效地与其他应用程序进行通信。

官方 FastAPI 文档

 

那么,为什么选择 FastAPI 而不是 Flask 或 Django REST?

因为 FastAPI 的速度与 Node.js 和 Go 一样快,使用 Python 类型提示进行验证,自动生成文档,并且设计上是异步的。与 Flask 相比,它开箱即用更具可扩展性。与 Django REST Framework 不同,它是极简且快速的。

在现实世界中,FastAPI 被用于生产环境中,许多公司正在构建生成式人工智能后端、微服务、机器学习模型部署,以及需要快速推进且注重代码整洁和性能的初创企业。

 

实现

要跟随本教程,请确保您的系统上已安装Python。您可以从 python.org 下载。

我们将使用虚拟环境(venv)来隔离依赖项——这有助于避免破坏全局包,并保持项目的整洁。

接下来,我们将使用PyCharm IDE社区版,因为社区版是免费的 :)——它提供智能代码建议、自动虚拟环境检测和内置终端,使Python开发顺畅高效。您可以从 PyCharm下载 中搜索 PyCharm社区版。

现在,让我们构建您的第一个FastAPI应用:

  1. 创建一个名为 fastapi_intro 的文件夹。
  2. 打开PyCharm并在该文件夹内创建一个新的Python项目。或者右键单击该文件夹并点击“使用PyCharm打开”,这将自动创建一个 main.py 文件。
  3. 在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

 

关于 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

您的输入 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_1number_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

试着自己写出来——并在评论区分享你的版本!💬

更多