技术选型
问题
Python 项目技术选型时如何评估和决策?Web 框架、ORM、异步方案怎么选?
答案
决策框架
Web 框架选型
| 维度 | Django | Flask | FastAPI |
|---|---|---|---|
| 定位 | 全栈 | 微框架 | 高性能 API |
| 学习曲线 | 中 | 低 | 低 |
| 异步支持 | 部分(4.1+) | 需扩展 | 原生 |
| ORM | 内置 Django ORM | 需 SQLAlchemy | 需 SQLAlchemy |
| Admin 后台 | 内置 | 无 | 无 |
| API 文档 | 需 DRF | 需扩展 | 自动生成 OpenAPI |
| 性能 | 中 | 中 | 高 |
| 适用 | CMS、管理系统 | 小型 API | 高性能微服务 |
选型建议:
- 需要 Admin 后台 → Django
- 纯 API + 高性能 → FastAPI
- 简单原型/脚本服务 → Flask
- 已有团队熟悉度是最大权重
ORM 选型
| 维度 | SQLAlchemy | Django ORM | Tortoise ORM |
|---|---|---|---|
| 灵活性 | 极高 | 中 | 中 |
| 异步 | 2.0 支持 | 4.1+ 部分 | 原生异步 |
| 学习曲线 | 高 | 低 | 低 |
| 迁移 | Alembic | 内置 | Aerich |
| 适用 | FastAPI/Flask | Django | 纯异步项目 |
异步方案选型
# 场景分析
"""
IO 密集(API 调用、数据库):asyncio + httpx + asyncpg
CPU 密集(数据处理):multiprocessing + ProcessPoolExecutor
混合型:多进程 + 进程内 asyncio
"""
评估模板
evaluation.py
# 标准打分卡
criteria = {
"性能": {"weight": 0.25, "scores": {"FastAPI": 9, "Django": 6, "Flask": 7}},
"生态成熟度": {"weight": 0.20, "scores": {"FastAPI": 7, "Django": 10, "Flask": 9}},
"团队熟悉度": {"weight": 0.20, "scores": {"FastAPI": 8, "Django": 5, "Flask": 7}},
"开发效率": {"weight": 0.15, "scores": {"FastAPI": 8, "Django": 9, "Flask": 7}},
"社区活跃度": {"weight": 0.10, "scores": {"FastAPI": 9, "Django": 9, "Flask": 7}},
"长期维护": {"weight": 0.10, "scores": {"FastAPI": 8, "Django": 10, "Flask": 8}},
}
def evaluate(criteria: dict) -> dict:
totals = {}
for criterion, data in criteria.items():
for framework, score in data["scores"].items():
totals.setdefault(framework, 0)
totals[framework] += score * data["weight"]
return dict(sorted(totals.items(), key=lambda x: -x[1]))
print(evaluate(criteria))
# {'FastAPI': 8.15, 'Django': 7.85, 'Flask': 7.45}
ADR(架构决策记录)
docs/adr/001-web-framework.md
# ADR-001: Web 框架选择 FastAPI
## 状态
已采纳
## 背景
新项目需要高性能 REST API,团队 3 人,预期 QPS 5000+
## 决策
选择 FastAPI
## 理由
- 原生异步,性能满足需求
- 自动生成 API 文档,减少维护成本
- 团队有 FastAPI 经验
## 风险
- Admin 后台需要额外开发
- 生态不如 Django 成熟
## 替代方案
- Django REST Framework:性能不够
- Flask:需要太多第三方库
常见面试问题
Q1: 技术选型最重要的因素?
答案:
- 团队熟悉度(最重要):团队能不能用好
- 需求匹配:框架能力是否满足
- 社区和生态:遇到问题能不能找到答案
- 长期维护:是否活跃维护
Q2: 如何说服团队采用新技术?
答案:
- 做 PoC 证明可行性
- 用数据/基准测试说话
- 在小项目试点
- 提供充足的学习资源
Q3: 什么时候不该换技术栈?
答案:
- 现有技术栈能满足需求
- 项目紧急,没时间学习
- 团队规模小,维护成本高
- 换技术的收益不明确