Pengwee Wang's blog

Back


FastAPI 项目开发与部署笔记#

本笔记总结了如何使用 FastAPI 构建一个模块化、可扩展的 API 系统,并通过 Docker 和 Docker Compose 实现高效的开发和部署流程。


1. 项目结构设计#

为了构建一个清晰、易维护的项目,项目采用以下结构:

特点:

  • 每个功能模块独立封装在 routers 文件夹下的子文件夹中。
  • 动态加载路由,支持灵活扩展。

2. FastAPI 核心功能实现#

(1) 路由定义#

使用 APIRouter 定义模块化路由。例如:

from fastapi import APIRouter

router = APIRouter(prefix="/image", tags=["Image Parsing"])

@router.get("/")
async def parse_image(url: str):
    result = HongshuParser(url)
    return result
python

(2) 自动化文档#

FastAPI 自动生成交互式文档页面:

  • Swagger UI: /docs
  • ReDoc: /redoc

可以通过以下方式定制文档页面:

  • 修改标题:自定义 HTML 模板。
  • 添加品牌化元素:如 Logo 和样式。

3. Docker 部署#

(1) Dockerfile#

Dockerfile 示例:

# syntax=docker/dockerfile:1.4
FROM --platform=$BUILDPLATFORM python:3.11

WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

COPY requirements.txt /app
RUN --mount=type=cache,target=/root/.cache/pip \
    pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 4725/tcp
CMD ["gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:4725", "app:app"]
dockerfile

(2) Docker Compose#

通过 docker-compose.yml 简化多容器管理:

version: '3.9'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - '4725:4725'
    volumes:
      - .:/app
    command: >
      gunicorn -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:4725 app:app
yaml

优点:

  • 使用 volumes 挂载本地代码,实时同步代码更改。
  • 支持多服务管理(如数据库、缓存等)。

4. 更新代码后的重新运行#

(1) 手动更新#

  1. 停止并删除旧容器:
    docker stop <docker 容器 ID | docker 容器>
    docker rm <docker 容器 ID | docker 容器>
    bash
  2. 重新构建镜像并运行:
    docker build -t <docker 容器> .
    docker run -d -p 4725:4725 --name <docker 容器> <docker 镜像>
    bash

(2) 使用 Docker Compose#

  1. 重新构建并启动:
    docker-compose up --build -d # -d 表示后台运行
    bash
  2. 如果挂载了本地代码,只需保存代码更改即可自动生效。

5. 项目拓展#

(1) 添加新功能#

新增功能非常简单,只需在 routers 文件夹下创建新的子文件夹,并按照以下步骤操作:

  1. 创建模块文件夹。
  2. 定义路由。
  3. 初始化模块。
  4. 测试新功能。

(2) 集成外部工具#

通过依赖注入的方式集成外部工具或服务(如数据库、缓存等)。例如:

def get_db():
    db = "Database Connection"
    return db

@app.get("/example-with-db")
async def example_with_db(db=Depends(get_db)):
    return {"db": db}
python

项目代码#

项目代码已上传至 Qiumo api, 部署置 Qiumo.fun

FastAPI项目开发与部署
https://pengweewang.github.io/blog/fastapi/
Author Pengwee Wang
Published at February 16, 2025