定位
Flask 是微框架:只做路由、请求响应、模板。其余(ORM、表单、认证、后台)都得自己选。
它的价值在「小」——二十行代码就能跑起一个接口,不需要理解框架设计。代价是项目变大后,你会自己手搓一套框架,而且大概率不如现成的。
安装
pip install flask
最小示例
# app.py
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.get('/')
def index():
return 'Hello'
@app.get('/users/<int:uid>')
def get_user(uid):
return jsonify({'id': uid, 'name': 'demo'})
@app.post('/users')
def create_user():
data = request.get_json()
return jsonify(data), 201
if __name__ == '__main__':
app.run(debug=True)
flask --app app run --debug
核心概念
1. 路由装饰器
@app.route('/users/<int:uid>', methods=['GET', 'POST'])
def user(uid): ...
<int:uid> 会自动转换类型。支持 string、int、float、path、uuid。
Flask 2.0 之后有快捷写法:@app.get、@app.post。
2. 应用上下文与请求上下文
这是 Flask 最独特(也最容易困惑)的设计:
from flask import request, g, current_app
@app.before_request
def load_user():
g.user = get_current_user() # g 是请求级容器
@app.get('/me')
def me():
return {'user': g.user.name}
request:当前请求g:请求级临时存储current_app:当前应用实例
它们依赖上下文栈,所以在请求外(比如定时任务里)直接用会报 working outside of application context。要用 app.app_context():
with app.app_context():
db.session.query(...)
3. Blueprint:模块化
项目变大后,路由要拆:
# users.py
from flask import Blueprint
bp = Blueprint('users', __name__, url_prefix='/users')
@bp.get('/')
def list_users(): ...
1. app.py
from users import bp
app.register_blueprint(bp)
常见坑
① 开发服务器不能上生产
app.run() 是单线程开发服务器。生产用 gunicorn:
gunicorn -w 4 -b 0.0.0.0:8000 app:app
② 全局变量在 worker 间不共享
gunicorn -w 4 是 4 个独立进程,全局 dict 各存各的。要共享状态用 Redis 或数据库。
③ 没有内置 ORM,选型要慎重
常见组合:
| 组合 | 特点 |
|---|---|
| Flask + SQLAlchemy | 最主流,功能全 |
| Flask + Peewee | 更轻,学习成本低 |
| Flask + Flask-SQLAlchemy | SQLAlchemy 的 Flask 封装,省配置但绑定更紧 |
选 Flask-SQLAlchemy 要谨慎:它把 session 生命周期绑到请求上下文,脱离请求使用容易出问题。直接用原生 SQLAlchemy 更灵活。
④ 异步支持有限
Flask 3.x 支持 async def 视图,但底层还是同步 WSGI(或用 flask[async] 配 ASGI)。不要指望在 Flask 里获得真正的异步并发——那是 FastAPI 的地盘。
什么时候选它
- 脚本型服务:给已有 Python 脚本套一层 HTTP
- 原型验证:先跑起来看需求对不对
- 内部小工具:几个接口,不值得上框架
- 教学:理解 Web 框架的最小构成
不选它的场景:项目会长期演进、需要后台管理、需要异步高并发、多人协作。
一个诚恳的判断
Flask 最大的风险是「中途变大」。
它适合「确定很小」的项目。但现实中很多项目从「就几个接口」长成了「有用户系统、权限、后台、定时任务」——那时候你手搓的半套框架会变成负债。
如果你预感到项目会变大,一开始就用 Django 或 FastAPI。迁移一个长到一半的 Flask 项目,成本比重新写还高。