本文定位类似于Django生态:Django-admin、Django-Compressor、Django-grappelli、django-rules,汇总整理几个Flask生态的开发框架。
大部分项目停留在简单介绍,根本学不完啊;留个印象。
Flask-Admin
Flask-RESTful
CookieCutter-Flask
Flask-AppBuilder
Flask-RESTX
Flask-Login
Flask-SQLAlchemy
Flask-Migrate
Flask-WTF
Flask-SocketIO
开源(GitHub,5.5K Star,902 Fork)项目,Flask与Socket.IO的桥梁,让Flask应用轻松实现实时双向通信。一行代码即可将传统HTTP服务升级为支持WebSocket的实时应用,开发者无需换框架就能拥有实时能力,官方文档。
特点
- 自动降级:底层根据浏览器和网络环境自动选择WebSocket(优先)或HTTP长轮询,即使在严格限制WebSocket的企业防火墙内也能正常工作
- 生态兼容:沿用 Flask 的路由、模板引擎、session 和 Blueprint 机制,现有 Flask 项目接入成本几乎为零。
- 多异步模式:支持 eventlet、gevent、threading 三种并发模式,生产环境推荐 gevent/eventlet,开发调试用 threading 即可。
适用场景
- 实时聊天、弹幕、在线客服
- 多人协同编辑(白板、光标同步)
- 实时通知推送、监控仪表盘
- 现有 Flask 项目快速升级实时能力
不适用
- 对延迟极度敏感的 HFT(高频交易)场景
- 已经跑在专业 WebSocket 服务(Go/Node)后面的架构
- 需要 MQTT/AMQP 级别的消息可靠性和持久化保证
实战
基于pip安装:
bash
pip install flask-socketio gevent
生产推荐安装gevent或eventlet异步并发库。
服务器端用@socketio.on装饰器注册事件,客户端emit消息,服务器收到后通过emit回传,数据以字典形式携带,结构简洁清晰:
py
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, async_mode='gevent')
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('my_event')
def my_event(message):
emit('my_response', {'data': message['data']})
if __name__ == '__main__':
socketio.run(app)
对应HTML客户端只需引入Socket.IO前端库、连接服务器、注册回调即可收到服务端响应:
ts
<script src="//cdn.socket.io/4/socket.io.min.js"></script>
<script>
const socket = io();
socket.on('my_response', (data) => {
console.log('收到:', data.data);
});
socket.emit('my_event', {data: 'Hello from client!'});
</script>
broadcast=True,服务器发出的消息会同时推送给所有连接的客户端,无需维护客户端列表;适用于直播间弹幕、实时协作、仪表盘推送等一对多场景:
py
@socketio.on('my_broadcast_event')
def my_broadcast_event(message):
emit('my_response', {'data': message['data'], 'count': 1}, broadcast=True)
Socket.IO内置"房间"抽象,客户端加入特定房间后,服务器向该房间广播时只有房间成员能收到,实现聊天室私聊、分组推送、游戏房间等隔离通信,一个服务器进程即可支撑大量独立房间:
py
@socketio.on('join')
def on_join(message):
room = message['room']
join_room(room)
emit('my_response', {'data': f'加入房间 {room} 成功'})
@socketio.on('leave')
def on_leave(message):
room = message['room']
leave_room(room)
emit('my_response', {'data': f'离开房间 {room} 成功'})
上线生产环境
- 反向代理(Nginx)已开启 WebSocket 支持(
proxy_http_version 1.1+proxy_set_header Upgrade $http_upgrade) - 确认负载均衡策略支持 WebSocket 长连接(sticky session 或 LB 层透传)
- 压测实际并发连接数是否达到预期,关注 gevent/eventlet 的 monkey patch 时机
Flask-MonitoringDashboard
开源(GitHub,827 Star,167 Fork)、轻量、开箱即用,性能、profile、异常,都可在一个可视化面板里查看。一个Flask 应用扩展(Dashboard),自动收集每个 endpoint 的请求次数、响应时间、请求走过的函数调用路径(profile)、以及异常堆栈和离群请求(outliers)信息。默认会把这些数据存下来,可在/dashboard页面(可配置)里看到各种图表和详细记录,官方文档。
试图解决以下问题:
- 难定位慢接口?FMD能显示某个
endpoint的历史性能趋势和慢请求样本 - 不知道代码里哪个函数耗时?每个请求会被
profile,合并后能看出哪些函数占时最多 - 偶发异常不容易复现?未处理异常会自动记录全量堆栈,手动捕获的异常也能通过
dashboard.capture(e)保存 - 想按天收某些业务指标(比如用户数)?可以配置自定义SQL查询,把结果按日展示
| 功能 | 做什么 | 适合场景 |
|---|---|---|
| 请求性能监控 | 显示各endpoint的请求量与响应时间趋势 | 发现并追踪慢接口 |
| 请求Profiling | 保存每次请求的执行路径,合并分析函数耗时 | 找出热点函数、优化点 |
| 异常监控 | 自动记录未处理异常并展示堆栈,支持手动capture | 快速定位线上错误来源 |
| 离群请求分析 | 自动识别耗时异常样本并保存请求信息与堆栈 | 排查sporadic慢请求 |
| 自定义指标 | 配置SQL查询按时间展示业务指标 | 定期观察业务数据(DAU、注册数等) |
优点:
- 上手快,
bind后就能开始收数据; - 数据和
trace做融合,能从宏观到微观看问题; - 支持把手动捕获的异常也存入面板,排查更灵活;
- 支持自定义扩展。
缺点和局限:
- 开箱即用适合中小型项目,大流量下需要注意存储和性能开销
- 默认配置可能需要调优(采样、数据保留周期等)
- 可视化和高级告警不是专门的APM那么丰富,遇到复杂需求可能还需结合其他工具
实战
基于pip安装:pip install flask_monitoringdashboard
示例:
py
from flask import Flask
import flask_monitoringdashboard as dashboard
app = Flask(__name__)
@app.route("/test")
def test():
return 'ok'
dashboard.bind(app)
app.run()
使用用户名密码admin/admin登录。