跳到主要内容

技术选型

问题

Python 项目技术选型时如何评估和决策?Web 框架、ORM、异步方案怎么选?

答案

决策框架

Web 框架选型

维度DjangoFlaskFastAPI
定位全栈微框架高性能 API
学习曲线
异步支持部分(4.1+)需扩展原生
ORM内置 Django ORM需 SQLAlchemy需 SQLAlchemy
Admin 后台内置
API 文档需 DRF需扩展自动生成 OpenAPI
性能
适用CMS、管理系统小型 API高性能微服务
选型建议:
- 需要 Admin 后台 → Django
- 纯 API + 高性能 → FastAPI
- 简单原型/脚本服务 → Flask
- 已有团队熟悉度是最大权重

ORM 选型

维度SQLAlchemyDjango ORMTortoise ORM
灵活性极高
异步2.0 支持4.1+ 部分原生异步
学习曲线
迁移Alembic内置Aerich
适用FastAPI/FlaskDjango纯异步项目

异步方案选型

# 场景分析
"""
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: 技术选型最重要的因素?

答案

  1. 团队熟悉度(最重要):团队能不能用好
  2. 需求匹配:框架能力是否满足
  3. 社区和生态:遇到问题能不能找到答案
  4. 长期维护:是否活跃维护

Q2: 如何说服团队采用新技术?

答案

  1. 做 PoC 证明可行性
  2. 用数据/基准测试说话
  3. 在小项目试点
  4. 提供充足的学习资源

Q3: 什么时候不该换技术栈?

答案

  • 现有技术栈能满足需求
  • 项目紧急,没时间学习
  • 团队规模小,维护成本高
  • 换技术的收益不明确

相关链接