第一个 FastAPI 应用(千字长文)

为什么选择 FastAPI 来构建你的第一个 Web API?

在当今的 Web 开发领域,构建一个快速、可靠、易于维护的后端服务,已经成为开发者的标配技能。而 FastAPI,正是近年来崛起的一颗新星。它基于 Python 3.7+ 的类型提示(Type Hints)特性,结合了现代 Web 框架的最佳实践,让你用最少的代码写出最健壮的 API。

想象一下,你正在搭建一个天气查询系统。传统做法可能需要写上百行代码来处理请求、校验数据、返回结果。而用 FastAPI,你只需几行代码,就能完成同样的功能,还能自动生成交互式文档,供前端或测试人员直接使用。

FastAPI 的一大亮点是它能自动生成 OpenAPI 和 Swagger UI 文档。这意味着,你不需要手动编写接口说明文档,框架会根据你的代码自动推导出接口规范。这种“约定优于配置”的思想,极大提升了开发效率。

更重要的是,FastAPI 的性能非常出色。它基于 Starlette(高性能异步框架)和 Pydantic(数据验证库),在处理高并发请求时表现优异。据官方测试,FastAPI 的吞吐量可达到传统 Flask 应用的 3 倍以上。

如果你是刚接触后端开发的初学者,或者已有一定经验但想尝试更现代的开发方式,那么 FastAPI 无疑是你迈出下一步的理想选择。今天,我们就来手把手带你完成你的第一个 FastAPI 应用,从零开始,一步步搭建属于你的第一个 API 服务。

安装 FastAPI 与运行环境

在动手编写代码之前,我们需要先准备好开发环境。FastAPI 依赖 Python 3.7 及以上版本,建议使用 Python 3.9 或更高版本以获得最佳体验。

打开你的终端(命令行工具),执行以下命令安装 FastAPI 和 Uvicorn(用于运行 FastAPI 应用的服务器):

pip install fastapi uvicorn

这个命令会安装两个核心组件:

  • fastapi:FastAPI 框架本身
  • uvicorn:一个高性能的 ASGI 服务器,用于运行 FastAPI 应用

安装完成后,你可以通过以下命令验证是否安装成功:

python -c "from fastapi import FastAPI; print('FastAPI installed successfully')"

如果输出 FastAPI installed successfully,说明安装成功。

接下来,我们创建一个名为 main.py 的文件,这是 FastAPI 应用的入口文件。这个文件将包含我们所有的 API 逻辑。

💡 提示:在实际项目中,你可能会使用 app.pyapi.py 作为入口文件,但 main.py 是 FastAPI 官方推荐的默认名称。

现在,我们来编写第一个 FastAPI 应用的核心代码。打开 main.py 文件,输入以下内容:

from fastapi import FastAPI

app = FastAPI(title="我的第一个 FastAPI 应用", description="一个简单的入门示例")

@app.get("/")
def read_root():
    # 返回一个字典作为响应内容
    return {"message": "欢迎来到我的第一个 FastAPI 应用!"}

这段代码虽然简短,但包含了 FastAPI 应用的核心结构。FastAPI 类是所有功能的基础,app 实例则承载了所有的路由和逻辑。@app.get("/") 是一个装饰器,它告诉 FastAPI:当用户访问根路径 / 时,执行下面这个函数。

创建第一个 API 接口:返回用户信息

现在我们已经搭建好了基础框架,接下来让应用“动起来”。我们来添加一个更实用的接口:根据用户 ID 返回用户信息。

main.py 文件中,继续添加以下代码:

users = {
    1: {"name": "张三", "age": 25, "email": "zhangsan@example.com"},
    2: {"name": "李四", "age": 30, "email": "lisi@example.com"},
    3: {"name": "王五", "age": 28, "email": "wangwu@example.com"}
}

@app.get("/users/{user_id}")
def get_user(user_id: int):
    # 检查用户 ID 是否在预设数据中
    if user_id not in users:
        # 如果用户不存在,返回 404 错误和提示信息
        return {"error": "用户不存在,请检查 ID 是否正确"}
    
    # 如果用户存在,返回对应用户信息
    return users[user_id]

这里的关键点在于路径参数 user_id: int。FastAPI 会自动根据类型提示对传入的参数进行类型校验。如果用户传入的 ID 不是整数(比如字符串 "abc"),FastAPI 会自动返回错误提示,无需手动编写校验逻辑。

✅ 举个例子:当你访问 http://127.0.0.1:8000/users/1 时,返回结果为:

{"name": "张三", "age": 25, "email": "zhangsan@example.com"}

这个过程就像快递员送包裹:你提供一个收件人 ID(路径参数),系统根据 ID 找到对应的包裹(用户数据),然后交付给你。如果收件人不存在,快递员就会告诉你“找不到这个地址”。

使用 Pydantic 进行数据验证与结构化响应

为了提升接口的健壮性,我们接下来引入 Pydantic。它是 FastAPI 的数据验证核心组件,能让你定义清晰的请求和响应结构。

main.py 中,我们修改用户接口,加入数据模型:

from pydantic import BaseModel

class User(BaseModel):
    name: str
    age: int
    email: str

@app.get("/users/{user_id}", response_model=User)
def get_user(user_id: int):
    if user_id not in users:
        return {"error": "用户不存在,请检查 ID 是否正确"}
    
    # 返回数据时,FastAPI 会自动验证是否符合 User 模型结构
    return users[user_id]

现在,User 类定义了用户数据的结构:必须包含 name(字符串)、age(整数)、email(字符串)。当接口返回数据时,FastAPI 会检查返回值是否符合这个结构,如果不符合,会自动报错。

这种设计就像一个标准化的表格:你填写的信息必须符合表格字段要求,否则系统会拒绝接收。这大大降低了因数据格式错误导致的 Bug。

启动服务并测试 API

现在,我们的第一个 FastAPI 应用已经完成。接下来,启动服务并进行测试。

在终端中执行以下命令:

uvicorn main:app --reload

命令解释:

  • main:app:表示从 main.py 文件中导入名为 app 的 FastAPI 实例
  • --reload:开启热重载,代码修改后会自动重启服务,方便开发调试

启动成功后,你会看到类似以下输出:

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

此时,打开浏览器,访问 http://127.0.0.1:8000,你会看到:

{"message": "欢迎来到我的第一个 FastAPI 应用!"}

接着访问 http://127.0.0.1:8000/docs,你会看到自动生成的交互式 API 文档界面(Swagger UI)。这里你可以直接点击按钮测试接口,查看请求和响应的详细信息。

🎯 小技巧:在 Swagger UI 中,你可以直接输入用户 ID,点击“Try it out”按钮,系统会自动发送请求并返回结果,非常方便调试。

高级功能:添加 POST 接口与请求体验证

为了让应用更完整,我们再添加一个创建用户的功能。这次我们将使用 POST 方法,并接收 JSON 格式的请求体。

main.py 中添加以下代码:

class CreateUser(BaseModel):
    name: str
    age: int
    email: str

@app.post("/users/")
def create_user(user: CreateUser):
    # 生成新的用户 ID(简单实现:当前最大 ID + 1)
    new_id = max(users.keys()) + 1
    
    # 将用户数据保存到字典中
    users[new_id] = {
        "name": user.name,
        "age": user.age,
        "email": user.email
    }
    
    # 返回成功信息和新用户 ID
    return {"message": "用户创建成功", "user_id": new_id}

这个接口接收一个 JSON 请求体,例如:

{
  "name": "赵六",
  "age": 32,
  "email": "zhaoliu@example.com"
}

FastAPI 会自动将 JSON 数据解析为 CreateUser 模型对象,并进行类型验证。如果字段类型错误(比如 age 写成字符串),会立即返回错误提示。

通过这个例子,你可以看到 FastAPI 如何将“定义接口”和“验证数据”融为一体,极大减少了重复代码。

总结与下一步建议

通过本篇教程,你已经成功完成了你的第一个 FastAPI 应用。从环境搭建、接口开发、数据验证到文档生成,整个流程清晰、高效。FastAPI 不仅让开发变得简单,还带来了极高的可维护性和可靠性。

在实际项目中,你可以将用户数据从内存字典迁移到数据库(如 PostgreSQL、MySQL),将接口逻辑拆分到多个模块,甚至添加认证、日志、缓存等功能。

记住,学习框架的真正意义,不在于记住多少语法,而在于理解“为什么这么设计”。FastAPI 的设计哲学——类型驱动、自动文档、高性能,正是现代 Web 开发的未来方向。

现在,你已经迈出了关键一步。不妨从今天开始,用 FastAPI 为你的下一个项目构建 API 吧。