Skip to content

太棒了,欢迎来到第四阶段:综合应用与架构(API 开发篇)

在这一章,我们将完成从“写脚本”到“写服务”的质变。你之前提到的“AI 内容工厂”、“自媒体封面生成系统”,其后端核心大概率就是用这一章的技术构建的。

在 Python 领域,以前流行 Flask(轻量)和 Django(全能但重)。但现在,FastAPI 才是当红炸子鸡,特别是对于 AI 应用。

为什么选 FastAPI?(对比 Node.js)

  • Node.js (Express/Koa): 你需要手动写很多中间件来处理参数验证,或者引入 Joi/Zod 库。

  • Python (FastAPI):

    • 极速:基于 StarlettePydantic,性能接近 Go 和 Node.js。

    • 自带文档:你写完代码,Swagger UI 文档自动生成(不用像 Node 那样手写 YAML)。

    • 类型安全:利用 Python 的 Type Hints(类似 TypeScript),开发体验极佳。


实战项目:AI 内容处理微服务

目标:构建一个 Web 服务,接收一篇长文章,模拟“AI 总结”功能,并返回 JSON 数据。这是你未来“AI 内容工厂”的雏形。

1. 环境准备

我们需要安装两个核心库:

  • fastapi: 框架本体。

  • uvicorn: 一个高性能的 ASGI 服务器(你可以把它理解为 Python 版的 Nginx/Node 运行时,用于运行异步 Python Web 应用)。

Bash

# 在你的虚拟环境中运行
pip install fastapi uvicorn

2. 核心概念:Pydantic (数据验证)

在 Node.js 中,你可能习惯直接解构 req.body。但在 FastAPI 中,我们先定义“模型”(类似 TypeScript 的 Interface)。

新建文件 main.py

Python

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional
import time

# 1. 初始化 APP
app = FastAPI(
    title="AI Content Factory API",
    description="专门用于处理自媒体内容的后端服务",
    version="1.0.0"
)

# 2. 定义数据模型 (Schema)
# 这相当于 TypeScript 的 interface,但它会在运行时自动验证数据!
class ArticleRequest(BaseModel):
    title: str
    content: str
    platform: str = "Douyin"  # 默认值
    max_length: Optional[int] = 100 # 可选参数

class AnalysisResult(BaseModel):
    summary: str
    tags: list[str]
    processing_time: float

# 3. 编写 API 路由
@app.get("/")
async def root():
    """健康检查接口"""
    return {"message": "Service is running correctly"}

# POST 接口:模拟 AI 文本分析
@app.post("/analyze", response_model=AnalysisResult)
async def analyze_article(article: ArticleRequest):
    """
    接收文章内容,返回模拟的 AI 分析结果。
    FastAPI 会自动验证 request body 是否符合 ArticleRequest 的定义。
    """
    start_time = time.time()
    
    # --- 模拟业务逻辑 (Mock AI) ---
    print(f"正在处理来自 {article.platform} 的文章: {article.title}")
    
    if len(article.content) < 10:
        # 自动处理 HTTP 错误
        raise HTTPException(status_code=400, detail="文章内容太短,无法分析")

    # 模拟耗时操作 (异步非阻塞)
    # 在真实场景中,这里会调用 OpenAI API 或本地的 PyTorch 模型
    import asyncio
    await asyncio.sleep(1) 
    
    # 模拟生成的摘要
    fake_summary = f"【{article.platform}独家】{article.content[:20]}... (AI已自动总结)"
    
    # --- 构造返回数据 ---
    result = {
        "summary": fake_summary,
        "tags": ["AI", "Tech", article.platform],
        "processing_time": round(time.time() - start_time, 2)
    }
    
    return result

# 注意:生产环境通常通过命令行启动,但开发时可以在这里写入口
if __name__ == "__main__":
    import uvicorn
    # reload=True 表示代码修改后自动重启服务器 (类似 nodemon)
    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)

3. 运行与体验“魔法”

在终端运行:

Bash

python main.py

或者直接用 uvicorn 命令:

Bash

uvicorn main:app --reload

见证奇迹的时刻

不要用 Postman,直接打开浏览器访问:http://127.0.0.1:8000/docs

你会看到一个自动生成的交互式文档 (Swagger UI)

  1. 点击 /analyze -> Try it out

  2. 你可以直接修改 JSON Request Body。

  3. 点击 Execute

  4. 你会看到 Python 后端返回的 JSON 数据,以及验证错误的提示(如果你把 content 删掉,它会报错 Field required)。


4. 深度解析 (Architecture)

为了让你理解这背后的架构,通过下面这个图解来对比 Node.js 和 FastAPI 的处理流程:

  1. Request (JSON): 客户端发送 JSON 数据。

  2. Uvicorn (ASGI): 接收 HTTP 请求,解析协议。

  3. Pydantic (Validation): 这是关键步骤。FastAPI 自动把 JSON 转换成 Python 对象 (article 变量)。如果数据类型不对(比如 max_length 传了字符串),直接在这一层拦截并报错,根本不会进入你的业务逻辑函数。

    • Node.js 对比: 这相当于在 Express Controller 之前加了一层极其严格的 Zod/Joi 验证中间件。
  4. Path Operation (Async): 执行你的 analyze_article 函数。

  5. Response: 返回 Python 字典,FastAPI 自动序列化为 JSON。


5. 连接数据库(架构前瞻)

你之前提到了 PostgreSQL。在 FastAPI 中,我们通常使用 SQLAlchemy (ORM) 来操作数据库。

虽然本章不展开写数据库代码(因为那会增加很多配置复杂度),但逻辑是这样的:

Python

# 伪代码演示架构分层
@app.post("/create_project")
async def create_project(project: ProjectSchema, db: Session = Depends(get_db)):
    # 1. 验证数据 (Pydantic 自动完成)
    
    # 2. 数据库操作 (ORM)
    new_project = ProjectModel(name=project.name, owner="User")
    db.add(new_project)
    db.commit()
    
    return {"status": "success", "id": new_project.id}

这种 Dependency Injection (依赖注入) (db: Session = Depends(get_db)) 是 FastAPI 的核心设计模式,让数据库连接管理变得非常优雅。


课后挑战 (Homework)

现在的 API 只是个“空壳”,我们来给它加点真材实料

任务

修改 /analyze 接口,让它真正调用一个第三方 API(可以用简单的免费 API,比如“一言”或者简单的翻译 API),或者简单点,写一个逻辑:

  • 如果文章中包含 "Python",summary 返回 "Python 相关技术文"。

  • 如果文章中包含 "Money",summary 返回 "财经类文章"。

  • 并将每次调用的记录(时间、标题)写入一个本地的 log.txt 文件(复习文件操作)。

思考题

如果我要上传图片(做封面生成),API 应该怎么设计?(提示:FastAPI 有 UploadFile 类型)。

当你完成这一步,你就拥有了开发后端服务的能力。接下来的一章,我们将探讨 AI Agent 的核心逻辑(如何把 API 和 LLM 结合起来)。

你想继续深入 API 的数据库操作,还是直接进入 AI/LLM 的调用环节?

坚持是一种品格