Flask怎么实现WebSocket长连接

落浩同学_6195

落浩同学_6195

2026-10-17

540人浏览

原创

flask原生不支持websocket,必须借助flask-socketio(配eventlet/gevent或asgi)、uvicorn+websockets等方案实现;硬套@app.route或werkzeug服务器会导致握手失败、400错误或静默断连。

flask怎么实现websocket长连接

Flask原生不支持WebSocket,别硬套flask自带路由

Flask 的 app.route 和 WSGI 服务器(如 Werkzeug、Gunicorn)根本处理不了 WebSocket 握手和持久连接。你写 @app.route('/ws') 然后返回 101 Switching Protocols,Werkzeug 会直接报错或静默断连——它压根不解析 Upgrade: websocket 头。这不是配置问题,是架构限制。

必须换用支持 ASGI 或原生 WebSocket 的服务层:

  • Flask-SocketIO:最常用,底层可选 eventlet 或 gevent(需 monkey patch),也支持 async_mode='asgi' 配合 uvicorn
  • FastAPI + websockets:更现代,但这就不是 Flask 了
  • 纯 websockets 库 + 自建 HTTP 路由:绕过 Flask,自己处理静态文件和普通 API,WebSocket 单独跑一个 websockets.serve 实例

用Flask-SocketIO时,async_mode选哪个?

默认 async_mode='eventlet',但它要求所有 I/O 操作(比如数据库、HTTP 请求)都得兼容 eventlet 的协程调度,否则会阻塞整个连接池。常见坑:

  • 用了 requests 同步发请求?→ 必须换成 eventlet.monkey_patch(),且得在 import 任何标准库前调用
  • 用了 sqlite3?→ 默认线程锁机制和 eventlet 不兼容,容易死锁;建议换 psycopg2 + PostgreSQL,或加 check_same_thread=False(仅开发)
  • 想用 async/await 写 handler?→ 得设 async_mode='asgi',然后用 uvicorn 启动,此时 socketio 对象要从 SocketIO(app, async_mode='asgi') 初始化,且不能混用 eventlet 相关代码

简单项目推荐 async_mode='threading'(无并发压力时够用),高并发生产环境建议直接上 async_mode='asgi' + uvicorn --workers 2 app:app。

FastAPI Flask Proxy
FastAPI Flask Proxy

FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。

下载

emit 和 send 的作用域差异很关键

这两个函数看着像,行为却完全不同:

  • send(data):只发给当前触发事件的客户端(即“单播”),适合响应用户操作,比如用户发消息后回个 "已收到"
  • emit('chat', data):默认也是单播;但加 broadcast=True 就变成广播(除发送者外所有人),加 include_self=True 才包含自己
  • 想定向推给某房间?→ 先 join_room('room-123'),再 emit('msg', data, to='room-123');注意 to 参数值是字符串,不是变量名
  • 跨进程广播(比如多 worker)需要消息队列后端,如 redis:SocketIO(app, message_queue='redis://'),否则 emit(..., broadcast=True) 只在当前进程生效

前端连接不上?先检查Socket.IO客户端版本和路径

浏览器控制台报 WebSocket connection to 'ws://...' failed 或 400 Bad Request,90% 是因为前后端 Socket.IO 版本不匹配或路径没对齐:

  • 服务端用的是 Flask-SocketIO==5.3.6(对应 Socket.IO 协议 v4),前端就得用 socket.io-client@4.x,不能用 @3.x 或 @latest(目前是 4.7+,兼容)
  • 默认挂载路径是 /socket.io/,前端 new io('http://localhost:5000') 就行;但如果服务端配了 path='/my-sock',前端必须显式写 io('http://localhost:5000', { path: '/my-sock' })
  • Nginx 反向代理 WebSocket 必须透传 Upgrade 和 Connection 头,否则握手失败;配置里漏了 proxy_set_header Upgrade $http_upgrade; 这一行,前端就永远连不上

真实部署时,message_queue 选型、Nginx 配置、client 版本对齐,这三处出问题的概率远高于 Python 代码本身。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
flask框架如何搭建
flask框架如何搭建

搭建步骤:1、安装Python和Pip;2、创建虚拟环境;3、安装Flask;4、创建Flask应用;5、运行应用;6、访问应用。想了解更多flask框架的相关内容,可以阅读本专题下面的文章。

2024.06.27

3555

8

Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

2025.08.25

5444

10

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

2025.12.15

296

16

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

0

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

0

15

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

2026.10.15

0

20

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

2026.10.15

0

18

Vue.js 中 ref 和 reactive 的区别
Vue.js 中 ref 和 reactive 的区别

Vue.js中ref和reactive的区别专题汇集两种响应式API的定义、访问方式、对象解构、侦听与性能取舍等文章,帮助结合实际状态类型选择合适写法。

2026.10.15

0

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Flask-Migrate数据库迁移文档
Flask-Migrate数据库迁移文档

共0课时 | 0人学习

Flask官方快速入门文档
Flask官方快速入门文档

共0课时 | 0人学习