第一个 FastAPI 应用(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言:为什么选择 FastAPI?

在当今互联网时代,API(应用程序编程接口)已成为连接不同系统的核心桥梁。无论是移动应用、Web 应用还是物联网设备,都需要通过 API 实现数据交互。而 FastAPI 作为 Python 领域的后起之秀,凭借其高性能、易读性和开发者友好性,迅速成为构建 API 的首选框架。

FastAPI 的核心优势在于:

  • 基于 Python 3.7+ 的现代特性,如类型提示(Type Hints),极大提升了代码的可读性和可维护性;
  • 自动文档生成,开发者无需额外编写说明文档,用户可通过交互式界面直接测试 API;
  • 异步支持,在处理高并发场景时,性能远超传统框架;
  • 简洁直观的代码风格,让新手也能快速上手。

本篇文章将通过一个实际案例,带领读者从零开始构建第一个 FastAPI 应用,涵盖基础功能实现、参数处理、数据验证等核心知识点,帮助读者掌握构建现代 API 的核心技能。


环境准备:搭建开发环境

安装 FastAPI 和 Uvicorn

FastAPI 本身是一个轻量级框架,需要配合 ASGI 服务器运行。推荐使用 uvicorn 作为开发服务器:

pip install fastapi uvicorn

工具推荐

  • 代码编辑器:VS Code、PyCharm 等支持调试和代码补全的工具;
  • API 测试工具:Postman 或 Swagger UI(FastAPI 内置支持);
  • 虚拟环境:建议使用 python -m venv 创建独立环境,避免依赖冲突。

第一个 FastAPI 应用:Hello World

步骤 1:创建基础文件

新建一个名为 main.py 的文件,输入以下代码:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Hello FastAPI!"}

步骤 2:启动应用

在终端中运行:

uvicorn main:app --reload

访问 http://localhost:8000,你会看到自动生成的交互式文档界面。点击 GET / 接口,点击 Try it out,即可看到返回的 JSON 响应。

代码解析

  • FastAPI() 实例化应用对象;
  • @app.get("/") 定义根路径的 GET 请求处理函数;
  • async def 标记异步函数(FastAPI 默认支持异步)。

扩展功能:路径操作与参数处理

路径操作的丰富性

FastAPI 支持 HTTP 方法的装饰器,如 @app.get()@app.post()@app.put()@app.delete()。例如,创建一个查询用户信息的接口:

@app.get("/users/{user_id}")
async def read_user(user_id: int):
    return {"user_id": user_id, "name": "John Doe"}

访问 http://localhost:8000/users/123,将返回包含用户 ID 的 JSON 数据。

路径参数 vs 查询参数

FastAPI 可以同时处理两种参数类型:

路径参数(Path Parameters)

直接嵌入在 URL 路径中的参数,如 /users/{user_id}

查询参数(Query Parameters)

附加在 URL 后的键值对,如 /items?skip=0&limit=10

from fastapi import Query

@app.get("/items/")
async def read_items(skip: int = 0, limit: int = Query(10, ge=1, le=100)):
    return {"skip": skip, "limit": limit}

此处 Query 用于定义参数的默认值、最小值(ge)和最大值(le)。


数据验证与序列化:Pydantic 的强大支持

FastAPI 内置了 Pydantic 库,用于数据验证和序列化。通过类型注解和模型定义,可以实现自动化的数据校验。

示例:定义用户模型

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    email: str = None
    is_active: bool = True

接收 POST 请求数据

@app.post("/users/")
async def create_user(user: User):
    return {"user_id": user.id, "name": user.name}

当发送 POST 请求时,FastAPI 会自动验证数据格式。例如,若缺少 id 字段,会返回 422 错误:

curl -X POST "http://localhost:8000/users/" -H "Content-Type: application/json" -d '{"name": "Alice"}'

响应结果:

{
  "detail": [
    {
      "loc": ["body", "id"],
      "msg": "field required",
      "type": "value_error.missing"
    }
  ]
}

异步编程:释放 FastAPI 的高性能潜能

FastAPI 的异步能力使其在处理高并发时表现优异。通过 asyncawait 关键字,可以轻松实现非阻塞 I/O 操作。

同步 vs 异步示例

同步代码:

import time

@app.get("/sync/")
def read_sync():
    time.sleep(2)
    return {"status": "Sync done"}

异步代码:

import asyncio

@app.get("/async/")
async def read_async():
    await asyncio.sleep(2)
    return {"status": "Async done"}

当多个请求同时访问 /async/ 时,FastAPI 会并发处理,而 /sync/ 则会逐个阻塞执行。


依赖注入:模块化的代码设计

依赖注入(Dependency Injection)是 FastAPI 的重要特性,用于解耦代码和复用逻辑。

示例:验证用户权限

async def get_current_user(token: str = Depends(oauth2_scheme)):
    user = get_user_from_token(token)
    if not user:
        raise HTTPException(status_code=401, detail="Invalid token")
    return user

@app.get("/protected/")
async def protected_endpoint(current_user: User = Depends(get_current_user)):
    return {"user": current_user.name}

此处 get_current_user 是一个依赖函数,被多个接口复用,实现了权限验证的集中管理。


错误处理与日志记录:完善应用健壮性

自定义异常处理

from fastapi import Request
from fastapi.responses import JSONResponse

@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    return JSONResponse(
        status_code=422,
        content={"detail": "Validation failed", "errors": exc.errors()},
    )

集成日志

使用 Python 标准库 logging 模块记录请求信息:

import logging

logging.basicConfig(level=logging.INFO)

@app.get("/log/")
async def log_endpoint():
    logging.info("Received a GET request to /log/")
    return {"status": "Logged"}

部署与扩展:从开发到生产环境

部署选项

FastAPI 可以部署在多种服务器上,如:

  • Uvicorn + Gunicorn:组合使用实现负载均衡;
  • Docker 容器化:通过 Dockerfile 封装环境;
  • 云服务:AWS、Azure 等平台提供一键部署方案。

示例:Dockerfile 配置

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]

结论:迈向更复杂的 API 开发

通过本篇文章的实践,读者已经掌握了从环境搭建到部署的全流程。FastAPI 的类型提示、自动文档、异步支持等特性,使其成为构建现代 API 的理想选择。

建议读者接下来尝试:

  1. 实现分页查询和数据库集成;
  2. 学习 OAuth2 认证和 JWT 实现;
  3. 探索 FastAPI 的 WebSocket 和 GraphQL 支持。

记住,构建第一个 FastAPI 应用只是起点,持续实践和探索将帮助你掌握更多高级技巧,最终开发出高效、可靠的 API 系统。

最新发布