讲师中心 微信公众号
AI工具推荐 视频效率加速

Flask怎么使用Flask-SocketIO实现实时聊天室

风伟小哥_9668

风伟小哥_9668

发布时间:2026-09-19 08:06:30

|

788人浏览过

|

来源于php中文网

原创

Flask-SocketIO不可仅用Flask自带路由,因HTTP无状态短连接无法维持长连接;必须通过封装python-socketio与eventlet/gevent实现双向实时通信,初始化需显式设async_mode='eventlet'、提前eventlet.monkey_patch()、调用socketio.run()启动。

flask怎么使用flask-socketio实现实时聊天室

Flask-SocketIO 为什么不能只用 flask 自带的路由

因为 HTTP 是无状态、短连接协议,flask 的普通视图函数每次请求都新建响应后就断开,没法维持长连接来实时收发消息。而聊天室要求服务端能随时向已连接的客户端广播消息,必须靠 WebSocket(或兼容降级方案)——Flask-SocketIO 就是封装了 python-socketio 和异步服务器(如 eventletgevent),让 Flask 应用支持双向实时通信。

常见错误:直接 pip install flask-socketio 后照搬普通 Flask 写法,没换异步服务器,结果 connect 事件不触发、消息发不出、控制台静默失败。

  • 必须显式启用异步模式:async_mode='eventlet'(推荐)或 'gevent',不能留空或用 'threading'
  • eventlet 需要提前 monkey patch:import eventlet; eventlet.monkey_patch(),且必须在导入其他模块前执行
  • 启动命令不能用 flask run,得调用 socketio.run(app),否则 WebSocket 协议不生效

怎么初始化并正确启动 SocketIO 实例

核心是把 SocketIO 和 Flask app 绑定,并指定异步模式和静态文件路径(避免前端 socket.io.js 404)。

from flask import Flask, render_template
from flask_socketio import SocketIO
import eventlet
eventlet.monkey_patch()  # 必须最前
<p>app = Flask(<strong>name</strong>)
app.config['SECRET_KEY'] = 'your-secret-key'
socketio = SocketIO(app, async_mode='eventlet', cors_allowed_origins="*")</p><p>@app.route('/')
def index():
return render_template('chat.html')</p><p>if <strong>name</strong> == '<strong>main</strong>':
socketio.run(app, host='0.0.0.0', port=5000, debug=True)

注意:cors_allowed_origins 在开发时设为 "*" 可绕过跨域;生产环境务必指定具体域名。如果漏掉 eventlet.monkey_patch(),即使装了 eventlet,也会卡在连接握手阶段,浏览器 Network 面板里看到 pending 状态但无报错。

前后端如何约定消息格式并处理 connect/message 事件

Socket.IO 的事件名是字符串,不是 REST 路由,前后端必须一致。典型聊天室只需三个基础事件:connect(建立连接)、message(发消息)、disconnect(断开)。服务端用 @socketio.on('event_name') 监听,前端用 socket.emit('event_name', data) 触发。

Flask 3.0.2
Flask 3.0.2

Flask 3.0.2 是 Flask 的官方历史稳定版本,下载地址使用 PyPI wheel 包直链,适合指定版本安装和项目环境复现。

下载

常见坑:message 是 Socket.IO 的保留事件名,自定义消息类型别用它——改用 send_message 更安全。

  • 服务端接收并广播示例:
    @socketio.on('send_message')
    def handle_message(data):
        username = data.get('username', 'anonymous')
        text = data.get('text', '').strip()
        if text:
            # 广播给除自己外的所有人
            socketio.emit('receive_message', {
                'username': username,
                'text': text,
                'timestamp': datetime.now().isoformat()
            }, include_self=False)
    
  • 前端发送逻辑(假设已引入 socket.io.js):
    const socket = io();
    socket.on('connect', () => {
        console.log('Connected, id:', socket.id);
    });
    document.getElementById('send-btn').onclick = () => {
        const msg = document.getElementById('msg-input').value;
        socket.emit('send_message', { username: 'Alice', text: msg });
        document.getElementById('msg-input').value = '';
    };
    socket.on('receive_message', (data) => {
        const div = document.createElement('div');
        div.innerHTML = `<b>${data.username}:</b> ${data.text}`;
        document.getElementById('chat-log').appendChild(div);
        document.getElementById('chat-log').scrollTop = document.getElementById('chat-log').scrollHeight;
    });
    

为什么本地测试正常,部署到 Nginx 后 WebSocket 断连

Nginx 默认不转发 WebSocket 升级请求,会把 Upgrade: websocket 当普通 HTTP 请求处理,导致 400 或连接立即关闭。

必须在 Nginx 配置中显式透传 WebSocket 头:

location /socket.io/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:5000/socket.io/;
}

同时确保 Flask-SocketIO 初始化时设置 path='/socket.io/'(默认值),且前端 io('http://your-domain.com') 不要硬编码端口。另一个易忽略点:Nginx 的 proxy_read_timeout 默认 60 秒,WebSocket 长连接需调大(如 proxy_read_timeout 3600;),否则空闲一段时间后自动断开。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

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

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

2795

2024.06.27

Python Flask框架
Python Flask框架

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

4124

2025.08.25

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

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

256

2025.12.15

pycharm怎么改成中文
pycharm怎么改成中文

PyCharm是一种Python IDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。php中文网给大家带来了pycharm相关的教程以及文章,欢迎大家前来学习和阅读。

2229

2023.07.25

pycharm安装教程
pycharm安装教程

PyCharm是一款由JetBrains开发的Python集成开发环境(IDE),它提供了许多方便的功能和工具。本专题为大家带来pycharm安装教程,帮助大家解决问题。

4117

2023.08.21

如何解决pycharm找不到模块
如何解决pycharm找不到模块

解决pycharm找不到模块的方法:1、检查python解释器;2、安装缺失的模块;3、检查项目结构;4、检查系统路径;5、使用虚拟环境;6、重启PyCharm或电脑。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

718

2023.12.04

如何安装pycharm
如何安装pycharm

安装pycharm的步骤:1、访问PyCharm官方网站下载最新版本的PyCharm;2、下载完成后,打开安装文件;3、安装完成后,打开PyCharm;4、在PyCharm的主界面中等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

654

2024.02.23

python和pycharm的区别
python和pycharm的区别

Python和PyCharm是两个不同的概念,它们的区别如下:1、Python是一种编程语言,而PyCharm是一款Python集成开发环境;2、Python可以运行在各种不同的开发环境中,而PyCharm是专门为Python开发而设计的IDE等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

467

2024.02.23

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

140

2026.09.16

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn