从零开始做后端:FastAPI 新手实战指南

程序员的日常信号
2025-06-23 06:59
阅读 823

开篇:为什么选择 FastAPI?

我是在三年前正式把 Python 后端开发作为主职的。那时我们公司还在使用 Django 做内部系统,业务复杂度不算高,但接口响应慢、开发效率低成了痛点。直到一次偶然的技术调研中,我接触到了 FastAPI —— 这是一个基于 Python 3.6+ 的现代 Web 框架,结合了异步支持和自动文档生成的强大能力。

说实话,第一次看到 Swagger 自动生成的 API 文档时,我觉得这东西太酷了。不仅减少了写接口文档的时间,还让前后端协作更顺畅了。于是我们决定在下一个项目中用 FastAPI 上线一个小模块试试看。这一试,就成了团队主力框架之一。

这篇分享,我会以一个真实的小项目为背景,讲讲我是如何从零开始上手 FastAPI 的,中间踩了哪些坑,以及一些个人的经验建议,希望对刚入门的新手能有所帮助。


问题描述:旧系统带来的困扰

2021 年的时候,我们负责的是一个企业内部的工单流转系统。前端是 Vue 编写的 SPA,后端是基于 Django 构建的传统 RESTful 接口,数据库使用的是 MySQL。

随着用户量增长和功能扩展,Django 开始暴露以下问题:

  • 接口响应慢:同步阻塞模型导致并发瓶颈明显,特别是一些 IO 密集型操作(如文件上传、第三方 API 调用)
  • 接口文档难维护:虽然用了 Django REST Framework 提供的文档支持,但实际用起来还是需要手动维护文档,前后端沟通成本高
  • 开发效率受限:很多基础结构重复性很高,比如序列化器、视图函数等,容易出错

我们需要一个能够快速迭代、性能更好、文档自动生成能力强的框架来支撑新功能的上线,同时也希望通过技术升级提升整体架构的现代化水平。


解决方案:引入 FastAPI 是必然的选择

在对比了 Tornado、Flask、Sanic、Starlette 和 FastAPI 之后,我们最终选择了 FastAPI。原因如下:

对比项 Flask Django Sanic Starlette FastAPI
异步支持 需要插件
自动生成文档 ✅(DRF)
类型提示 支持少 不友好 一般 支持好 ✅✅✅
性能表现
社区活跃度 非常高
易于上手 复杂 较陡峭 ✅✅

FastAPI 最大的优势在于它融合了 异步 + OpenAPI/Swagger UI 自动生成文档 + Pydantic 数据验证 三大核心特性,对于快速构建高性能服务非常友好。

缓存策略对比-2

我们最终选型的标准是:

  • 是否能无缝集成到现有微服务体系中?
  • 能否降低团队新人的上手门槛?
  • 是否有异步处理能力和良好的拓展空间?

FastAPI 完全满足要求。


代码实践:一个简单的任务管理接口设计

为了验证效果,我们先从一个基础需求入手 —— 实现任务创建和查询接口。这个任务系统包括以下几个字段:

  • id: 唯一标识符
  • title: 任务标题
  • description: 描述内容
  • status: 状态(待办、进行中、已完成)
  • create_time: 创建时间

1. 安装与启动

安装非常简单:

pip install fastapi uvicorn

启动方式也很简洁,适合本地调试:

uvicorn main:app --reload

main.py 示例结构如下:

from fastapi import FastAPI
from pydantic import BaseModel
from typing import List, Optional

app = FastAPI()

tasks = []

class Task(BaseModel):
    id: int
    title: str
    description: Optional[str] = None
    status: str
    create_time: str

@app.get("/tasks", response_model=List[Task])
def read_tasks():
    return tasks

@app.post("/tasks")
def create_task(task: Task):
    tasks.append(task)
    return {"message": "任务已添加"}

访问 http://localhost:8000/docs 即可查看 Swagger UI 自动生成的接口文档:

Swagger UI

2. 数据库集成:使用 SQLAlchemy ORM

我们在实际项目中使用的是 Postgres,结合 SQLAlchemy 来做数据库交互。FastAPI 本身不直接绑定数据库层,但可以很方便地整合:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "postgresql://user:password@localhost/dbname"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

然后定义实体类:

from sqlalchemy import Column, Integer, String, DateTime
from datetime import datetime

class TaskDB(Base):
    __tablename__ = 'tasks'
    
    id = Column(Integer, primary_key=True)
    title = Column(String)
    description = Column(String)
    status = Column(String)
    create_time = Column(DateTime, default=datetime.utcnow)

再配合依赖注入机制注入数据库会话,这样就完成了数据库连接的准备工作。


踩坑经验:那些年我踩过的坑

作为一个新手,我在搭建过程中也遇到不少“小坑”,有些甚至是生产环境才发现的,下面几个是我印象最深的:

1. 异步不是万能药

虽然 FastAPI 支持异步,但我一开始以为只要加上 async def 就能自动提升性能,结果发现某些 IO 密集型的场景下确实快了不少,但在 CPU 密集型或者纯逻辑操作中,反而增加了不必要的开销。

结论:合理评估是否真的需要异步,避免过度设计。

2. Pydantic 验证机制过于严格

我们刚开始在处理历史数据迁移时,经常碰到字段为空的情况,但 Pydantic 默认所有字段必须存在。后来学会了用 Optional 或者设置默认值解决这个问题:

description: Optional[str] = None

当然也可以自定义校验规则,灵活性非常高。

3. OpenAPI 文档无法显示请求 Body

有时写完接口却发现 POST 请求的 body 没有出现在 Swagger UI 中,后来发现是因为没有正确使用 pydantic.BaseModel 定义请求体,而只是用了原生类型。

正确的做法是:

@app.post("/tasks")
def create_task(task: TaskCreate):  # TaskCreate 是 BaseModel 子类

否则将不会被识别为 JSON body 输入。


效果总结:重构后的收益

数据库设计模型-1

我们将原有的部分 Django 接口逐步迁移到 FastAPI 后,整体效果显著:

  • 开发效率提升 30%:文档自动生成节省了大量时间,代码结构更清晰
  • 接口性能提高 40%:通过异步 + 合理使用连接池,响应速度大幅提升
  • 团队协作更顺畅:统一的技术栈和接口文档风格,降低了沟通成本
  • 运维压力降低:依赖少,配置灵活,更容易部署和监控

更重要的是,整个项目的可维护性和可拓展性大大增强,后续新增权限控制、异步消息队列等功能都变得更加容易。


经验分享:给新手的一些建议

如果你也是刚刚开始学习 FastAPI,这里有几个我总结下来的经验,希望对你有用:

1. 别一开始就追求大而全

FastAPI 很强大,但它并不是用来替代整个 Django 的。你可以从一个子系统或工具服务开始尝试,逐步熟悉它的机制。

2. 多用 Pydantic 模型管理输入输出

这是 FastAPI 的灵魂,能极大地减少手动校验的工作量,也能防止很多边界错误。

3. 尽早接入 OpenAPI 工具链

可以用自动化测试工具(如 Newman)、接口自动化平台对接 FastAPI 的 OpenAPI 输出,实现真正的 DevOps 流程。

4. 小心并发陷阱

即使是异步框架,也要注意数据库连接池大小、锁竞争等问题。不要因为框架是异步的就忽视底层资源争用的风险。

5. 生产环境务必启用 Gunicorn + Uvicorn Workers

本地调试可以用 uvicorn main:app --reload,但上线建议使用 Gunicorn 管理多个进程/线程,例如:

gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

这样可以更好地利用多核资源,同时保持异步能力。


结语:FastAPI 是值得投入的学习对象

回顾这两年来的技术选型和落地过程,FastAPI 给我们带来了很多惊喜。它不仅提高了我们的开发效率,也让我们更有信心去面对越来越复杂的业务需求。

如果你现在正准备入门 Python 后端开发,尤其是想打造高性能、易维护的接口服务,那么 FastAPI 是一个非常好的选择。

“一个好的框架,不是让你写得多快,而是让你写得更少、更稳。”——这是我亲身体会出来的一点心得。

希望大家都能在这个过程中,找到属于自己的编程乐趣 😊


如需完整项目源码和部署文档,欢迎留言交流!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝