Skip to main content

你将构建什么

本教程将带你从零构建一个 FastAPI 后端应用,采用双客户端架构
  • Profy(API Key) — 你的应用自己的 API Key,用于调用专家和 AI 模型
  • ProfyApp(OAuth) — 用户的 OAuth Token,用于向袋袋上报计费事件

前置条件

袋袋开发者账号

已注册袋袋账号并在开发者后台创建 App,获取 Client ID、Client Secret 和 API Key

开发环境

Python 3.10+、pip、基础 FastAPI 和 async/await 经验

Step 1: 项目初始化

创建 .env 文件存放凭证:
.env
永远不要将 .env 提交到版本控制。确保 .gitignore 包含该文件。

Step 2: 初始化双客户端

config.py
两个客户端各司其职:client(Profy)持有你的 API Key,用于 AI 调用;app_client(ProfyApp)持有 OAuth 凭证,用于用户授权和计费。

Step 3: Token 存储

手动实现 Token 存储。生产环境使用数据库,这里用 dict 演示核心模式:
token_store.py
生产环境必须用持久化存储(数据库 / Redis)。dict 在进程重启后会丢失所有 Token。参考 Token 管理最佳实践

Step 4: OAuth 登录流程

main.py

Step 5: 保护路由

通过 FastAPI 依赖注入自动加载并校验 Token:
dependencies.py

Step 6: 上报计费事件

main.py (续)
on_refresh 回调在 Token 自动刷新时触发。因为 Profy 的 Refresh Token 是一次性的(rotation),必须在回调中持久化新 Token。

Step 7: 调用 AI

使用 Profy(API Key)客户端调用专家或 AI 模型——这与用户 OAuth Token 无关:
main.py (续)

Step 8: 错误处理中间件

main.py (续)

值得写进代码的契约限制

计费端点在服务端强校验这几项。提前在自己这边挡一道,免得线上才发现是 400:
SDK 在你不传 idempotency_key 时会自动生成一个——但每次重试都生成新 UUID 等于没有幂等。幂等键要从业务单元派生(例如 f"summarize:{document_id}"),这样超时后的重试会收敛到同一次扣费,而不是给用户扣两次。

失败与对策

完整项目结构

requirements.txt
requirements.txt
启动开发服务器:

部署建议

多 Worker 部署

生产环境使用 gunicorn main:app -k uvicorn.workers.UvicornWorker -w 4。多 Worker 下 dict token store 不共享——必须用数据库或 Redis。

环境变量管理

生产环境通过 Kubernetes Secret 或云平台环境变量注入凭证,不要使用 .env 文件。Cookie 需设置 secure=True

数据库迁移

用 SQLAlchemy + Alembic 管理 Token 表。生产环境不要用 create_all

反向代理

在 Nginx / Caddy 后面运行,处理 HTTPS 终止。确保 X-Forwarded-Proto 正确传递。

下一步

Next.js 全栈集成

TypeScript 版本的双客户端全栈应用

按次计费实战

ProfyApp reportEvent 按次扣费

Token 管理最佳实践

并发刷新、安全存储、降级策略

SDK 完整指南

双语言 API 详解