【快速开始】一个简单的Flask-SocketIO应用,完成后端推送消息接收与关闭

python的Socket.IO详解 和提供了强大的工具来构建实时 Web 应用程序。通过利用 WebSocket 和事件驱动的编程模型,你可以轻松地实现复杂的实时交互功能。后续会持续更新分享相关内容,记得关注哦! 阅读详情

效果图

先看运行效果图
图1. 等待运行
图2.启动推送服务后效果
图3. 暂停推送服务效果
OK,下面开始。

安装环境

本人使用环境及版本:
Anaconda:

虚拟环境:
Python版本:3.8.13
安装包及版本:
Flask-SocketIO:5.3.4
eventlet:0.33.3

快速开始

后端代码

创建app.py文件(文件名随意,不过要与后面的运行脚本中指定的文件保持一致)

import time
from flask import Flask, render_template, jsonify
from flask_socketio import SocketIO

service_state = 0
app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*")

@app.route("/")
def index():
    return render_template("index.html")

@app.route("/start_service")
def start_service():
    global service_state
    service_state = 0
    while service_state == 0:
        time_text = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time())))
        print(">>>>>>", time_text)
        json_data = {"no": 1, "time": time_text, "msg": "......"}
        socketio.emit("service_msg", json_data)
        socketio.sleep(2)
    return jsonify({"start": True})


@app.route("/stop_service")
def stop_service():
    global service_state
    service_state = 9
    return jsonify({"stop": True})


if __name__ == "__main__":
    socketio.run(app, host="0.0.0.0", port=5200, debug=True, log_output=True)

前端代码

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8"/>
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
        <title>HCI Application</title>
        <link rel="apple-touch-icon" sizes="76x76" href="{{url_for('static', filename='img/favicon.ico')}}">
        <link rel="icon" type="image/png" href="{{url_for('static', filename='img/favicon.ico')}}">
        <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport'/>
        <!-- Font Awesome Icons -->
        <link rel="stylesheet" href="{{url_for('static', filename='fontawesome/css/all.css')}}">
        <!-- Main CSS -->
        <link rel="stylesheet" href="{{url_for('static', filename='css/main.css')}}"/>
        <!-- Animation CSS -->
        <link rel="stylesheet" href="{{url_for('static', filename='css/vendor/aos.css')}}"/>
    </head>
    <body> 
        <!---------- NAVBAR ---------->
        <nav class="navbar navbar-expand-lg navbar-dark bg-purple fixed-top">
            <div class="container-fluid">
                <a class="navbar-brand" href="#"><i class="fas fa-robot mr-2"></i><strong>HCI</strong> Application</a>
                <div class="navbar-collapse collapse" id="navbarColor02">
                    <ul class="navbar-nav ml-auto d-flex align-items-center">
                        <li class="nav-item">
                            <input type="hidden" id="running_state" value="0">
                            <button type="button" 
                                    class="btn btn-block btn-primary btn-round mb-1"
                                    id="btn_running_state"
                                    onclick="run_serivce()">
                                <i class="fas fa-play" id="i_running_state_icon"></i>
                                <b id="b_running_state_text">启动服务</b>
                            </button>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
        <!-- End Navbar -->
        <main class="container-fluid">
            <div class="position-relative">
                <div class="container-fluid text-dark mt-5 pt-5">
                    <!-- table -->
                    <table class="table table-left table-hover" id="tbl_log">
                        <thead class="bg-primary text-white">
                            <tr align="left">
                                <th scope="col" style="width:120px;">#</th>
                                <th scope="col" style="width:300px;">Time</th>
                                <th scope="col">消息内容</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr align="center" class="text-black">
                                <th scope="row" colspan="3">等待启动 ...</th>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </main>
        <!------------ JAVASCRIPTS ---------------->    
        <script src="{{url_for('static', filename='js/vendor/jquery.min.js')}}" type="text/javascript"></script>
        <script src="{{url_for('static', filename='js/vendor/popper.min.js')}}" type="text/javascript"></script>
        <script src="{{url_for('static', filename='js/vendor/bootstrap.min.js')}}" type="text/javascript"></script>
        <script src="{{url_for('static', filename='js/vendor/share.js')}}" type="text/javascript"></script>
        <script src="{{url_for('static', filename='js/functions.js')}}" type="text/javascript"></script>
        <script src="{{url_for('static', filename='js/vendor/aos.js')}}" type="text/javascript"></script>
        <script src="{{url_for('static', filename='js/socket.io.js')}}" type="text/javascript"></script>
        <noscript>
            <style>
                *[data-aos] {
                    display: block !important;
                    opacity: 1 !important;
                    visibility: visible !important;
                }
            </style>
        </noscript>
        <script>
            AOS.init({
                duration: 700,
                disable: function () {
                    var maxWidth = 1200;
                    return window.innerWidth < maxWidth;
                }
            });

            /*
            开启服务,获取分类运行结果
            */
            var line_number = 1;
            var socket = io();

            // 专门接收后端推送消息
            socket.on('service_msg', function(data) {
                var row = "<tr>" +
                                "<th scope=\"row\">" +  line_number + "</th>" +
                                "<td align=\"left\">" + data.time + "</td>" +
                                "<td align=\"left\">" + data.msg  + "</td>" +
                            "</tr>";                                
                line_number++;
                //添加数据到 table 第一行
                $("#tbl_log tbody").prepend(row);
            });
            
            /*
            运行服务,开始接收推送消息
            */
            function run_serivce() {
                $("#btn_running_state").attr("onclick", "pause_service()");
                $("#i_running_state_icon").attr("class", "fas fa-pause");
                $("#b_running_state_text").html("暂停服务");
                var row = "<tr align=\"center\" class=\"text-success\"><th scope=\"row\" colspan=\"3\">启动成功,开始接收数据 ...</th></tr>"
                $("#tbl_log tbody").prepend(row);
                $.ajax({
                    type: "get",          // 请求方式
                    url: "start_service", // 请求路径
                    async: true,          // 异步请求
                    dataType: "json",     // 预期返回一个 json 类型数据
                    success: function (data) {   // data是形参名,代表返回的数据
                        console.log(data);
                    }
                });
            }

            /*
            暂停服务
            */
            function pause_service() {
                $("#btn_running_state").attr("onclick", "run_serivce()");
                $("#i_running_state_icon").attr("class", "fas fa-play");
                $("#b_running_state_text").html("启动服务");
                var row = "<tr align=\"center\" class=\"text-secondary\"><th scope=\"row\" colspan=\"3\">服务暂停,等待开启 ...</th></tr>"
                $("#tbl_log tbody").prepend(row);
                $.ajax({
                    type: "get",          // 请求方式
                    url: "stop_service",  // 请求路径
                    async: true,          // 异步请求
                    dataType: "json",     // 预期返回一个 json 类型数据
                    success: function (data) {   // data是形参名,代表返回的数据
                        console.log(data);
                    }
                });
            }
        </script>
    </body>
</html>

运行步骤

cmd 或者 linux控制台运行即可

python app.py

此时能看到如下图所示
app运行效果
此时访问http://0.0.0.0:5200(0.0.0.0 替换成对应IP或者127.0.0.1或localhost即可看到图1-3效果)


代码理解

在python代码中,首先通过SocketIO封装flask app

socketio = SocketIO(app, cors_allowed_origins="*")

通过cors_allowed_origins="*"来指定支持跨域访问限制问题

另外设定全局变量service_state = 0用来控制服务运行状态,从而根据结果是否要向前端发送数据。

最后就是在启动接口/start_service上增加状态判断死循环,只要service_state = 0,就会不断向前端发送数据(我这加了2秒间歇),具体方法调用前面定义的socketio变量的emit函数即可,如下所示:

socketio.emit("service_msg", json_data)

而要停止推送服务的话,那只需要调用/stop_service改变全局变量service_state的值即可。

代码下载

【GitCode地址:flask_socketio_quickstart】

Flask-SocketIO 简单使用指南,Python面试宝典 上面的示例使用字符串消息。另一种类型的未命名事件使用 JSON 数据:最灵活的方式是使用自定义事件名称,在开发过程中最常用的也是这种方式。事件的消息数据可以是字符串,字节,整数或 JSON:自定义命名事件也可以支持多个参数:Flask-SocketIO 支持 SocketIO 命名空间,允许客户端在同一物理套接字上复用多个独立连接:如果未指定名称空间,'/'则使用具有名称的默认全局名称空间。对于装饰器语法不方便的情况,on_event可以使用该方法:pass。 阅读详情

相关推荐

WebSocket实战:用JavaScript和Python打造实时聊天应用(附完整代码)

本文提供了一份完整的WebSocket实战指南,教你使用JavaScript和Python构建实时聊天应用。文章详细对比了使用原生WebSocket API与Flask-SocketIO两种主流技术栈的实现方案,涵盖连接管理、消息协议、自动重连、心跳检测等核心功能,并附有完整的代码示例,帮助开发者快速掌握实时通信应用的开发要点。

weixin_29243063的博客 541

flask_socketio

flask_socketio 与HTTP不同的是,WebSocket提供全双工通信。 也就是说,传统的方式,只有当客户端发起请求后,服务器端才会发送数据, 而WebSocket可以让服务器主动发送数据给客户端,它是服务器推送技术的一种。 下图是WebSocket和HTTP的区别 pip install flask-socketio 参考网址: https://flask-socketio.readthedocs.io/en/latest/api.html https:

tangsiqi130的博客 8619

基于Flask构建插件化Web漏洞扫描器:架构设计与工程实践

Web漏洞扫描是网络安全领域的基础实践,其核心原理是通过模拟攻击者行为,向目标应用发送特定构造的请求,并根据响应内容判断潜在的安全缺陷。这项技术的价值在于能够自动化、大规模地识别SQL注入、XSS等常见安全风险,提升应用安全检测效率。在工程实现上,一个可扩展、易维护的扫描器架构至关重要。本文聚焦于如何利用Python的Flask微框架,结合插件化设计思想与异步任务队列,构建一个轻量级、高定制化的漏洞扫描系统。该系统通过将扫描引擎模块化,支持灵活集成各类检测插件,并利用Celery处理耗时任务,实现了从任务调

keke1314520的博客 445

Flask-SocketIO

Flask-SocketIO使Flask应用程序可以实现客户端和服务器之间的低延迟双向通信。客户端应用程序可以使用 Javascript、Python、C++、Java和Swift中的任何SocketIO客户端库或任何其他兼容客户端来建立与服务器的永久连接。

weixin_47906106的博客 6455

基于树莓派的智能家居系统:从传感器到Web控制的全栈实践

物联网系统通常由感知层、网络层、平台层和应用层构成,通过传感器采集数据,经由微控制器或单板计算机处理,再通过网络协议传输至服务器。其核心原理在于实现物理世界与数字世界的连接与交互,技术价值体现在远程监控、自动化控制和数据驱动的决策优化上,广泛应用于智能家居、环境监测和工业自动化等场景。本文以树莓派作为控制中枢,结合Python Flask框架和MySQL数据库,构建了一个集环境感知、设备控制和用户认证于一体的原型系统,详细阐述了硬件选型、电路连接、多线程服务设计以及实时数据可视化等关键环节,为理解物联网项目

weixin_33716154的博客 521

SAP MIGO屏幕增强的具体实施步骤介绍(SE19:MB_MIGO_BADI) <转载>

1.MIGO抬头屏幕增强具体增强实施步骤1.1.创建存储抬头客制化数据的增强表1.2.创建增强结构1.3.创建函数组ZMM_MIGO1.3.1.定义全局变量1.3.2.创建数据处理函数1.4.创建字屏幕9001屏幕PBOendif.endloop.1.5.实施新BADI增强SE19创建BADI实施双击实施类ZCL_MIGO_EN_01exportingendif.endmethod.endif.endif.exportingendmethod.

qq_55488207的博客 4511

flask-socketio:入门

入门 初始化 以下代码示例显示了如何将 Flask-SocketIO 添加到 Flask 应用程序: from flask import Flask, render_template from flask_socketio import SocketIO app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = SocketIO(app) if __name__ == '__main__': sock

Esun Blog 8856

流形优化: Manifold Optimization 的 全网最通俗版本详解 (一)

前言 之前忙于论文, 停更了很久。 接下来的一段时间,出于各种原因, 决定在优快云平台上做 最近在 混合波束成形 及 智能反射面 领域 非常常见的流形优化 (Manifold Optimization) 算法 的专题介绍。尽管目前已有了不少的中文博客, 但出于其各种弊端, 使得本篇的成文仍有其不可或缺的意义。 而如果要盘点最核心的意义, 就在于这篇是对读者的 数学能力 与 阅读理解能力 要求最低的 流形优化讲解了。 唯一参考的文献为 Manopt 工具包作者 Boumal 的 新书: An introd

B417科研笔记 2万+

Flask-SocketIO终极教程:10分钟搭建实时聊天室应用

Flask-SocketIO是一个为Flask框架提供Socket.IO支持的强大扩展,让开发者能够轻松实现实时双向通信功能。无论你是想构建在线聊天室、实时数据看板还是多人协作应用,这个工具都能帮你快速实现WebSocket通信需求。✨ ## 🚀 为什么选择Flask-SocketIO? **实时通信**已经成为现代Web应用的标配功能。Flask-SocketIO通过简洁的API设计,让你

gitblog_00617的博客 632

F5 Shape逆向工程实战:从美西南航空到xbk的风控突破

本文以美西南航空和xbk为例,深入剖析了F5 Shape风控系统的逆向工程实战。文章拆解了其核心防线,包括通信加密、JSVMP逆向分析和无孔不入的环境指纹检测,并分享了定位Header生成入口、模拟算法输出及构建真实浏览器环境的系统性方法与思路,为合规的技术研究与测试提供参考。

weixin_29327525的博客 1389

Hermes深入理解及源码解析(二):Hermes的记忆机制

源码位置:tools/memory_tool.py存储内容为两个文件,放在 ~/.hermes/memories/:MEMORY.md:Agent 自己的笔记(环境事实、项目约定、工具坑、学到的东西)—— 上限 2200 字符USER.md:关于用户的画像(角色、偏好、沟通风格)—— 上限 1375 字符作为一个独立的工具注册在系统中(为了让智能体正确使用它,System Prompt()中明确下达了禁令存储目标存储位置数据类型持久偏好/事实MEMORY.md我是谁、我喜欢什么、环境配置。

qq_41984117的博客 560

Flaskwebgui + SocketIO:打造实时通信的桌面应用终极指南

想要将你的Flask Web应用快速转变为功能强大的桌面应用程序吗?Flaskwebgui正是你需要的解决方案!这个神奇的Python库让你能够轻松地将Flask、FastAPI或Django Web应用打包成原生桌面应用。更重要的是,当你需要实现实时通信功能时,Flaskwebgui与SocketIO的完美结合,为你的桌面应用带来了无限可能!🚀 ## 为什么选择Flaskwebgui? F

gitblog_00251的博客 368

R语言 百度坐标转换至WGS84坐标

本文利用R语言封装了百度坐标转换至WGS84坐标的函数,亲测有效,提供了便捷的百度坐标转换方法。

qingchen98的博客 2135

gevent-socketio生产部署指南:Gunicorn worker与Nginx WebSocket代理配置

gevent-socketio 是 Python 生态中基于 gevent 协程模型的 Socket.IO 服务端实现,它让浏览器与服务器之间的实时双向通信变得简单可靠。在开发环境中直接运行即可,但一旦进入**gevent-socketio生产部署**环节,如何正确配置 Gunicorn worker、如何让 Nginx 完成 WebSocket 代理转发,就成了决定线上稳定性的关键。本文将用最直

gitblog_00976的博客 691

Open3D 基于法线的双边滤波

基于法线的双边滤波是一种用于点云平滑的技术,它结合了点与其邻域点之间的几何距离和法线方向的相似性,从而在去除噪声的同时保留几何特征。这种滤波方法广泛应用于点云处理领域,尤其是在需要保留表面细节和边缘的场景中。

纵马踏花向自由 2500

第154章 点云大规模并行处理(GPU加速)

优化点云处理✨ 使用。

yumeiguo的博客 374

基于Flask+Vue的宠物寄养系统开发实践

RESTful API是现代Web开发的核心技术,通过标准化接口实现前后端分离。Flask作为Python轻量级框架,配合SQLAlchemy ORM和JWT认证,能快速构建高性能后端服务。Vue.js的组件化开发与状态管理,则大幅提升前端开发效率。这种技术组合特别适合开发宠物寄养类平台系统,需要处理宠物档案管理、订单状态机、信用评价等复杂业务逻辑。项目中采用WebSocket实现实时通知,ECharts进行数据可视化,并通过Gunicorn+Nginx优化生产环境部署,为类似O2O服务平台开发提供了完整解

weixin_30292745的博客 356

十.镜头知识之畸变问题

对于理想光学系统,在一对共轭的物像平面上,像的放大率是一个常数。但是对于实际的光学系统,当视场较大或很大时,像的放大率就要随视场而异,这样就会使像相对于物体失去相似性。这种使像变形的成像缺陷称为畸变。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2124

Django、Flask与Tornado核心差异与选型指南

Python Web框架是构建后端服务的基础技术栈,其本质差异在于架构哲学与运行模型:Django采用全栈式同步MVT架构,强调约定优于配置;Flask以微内核设计支持插件化扩展,赋予开发者高度控制权;Tornado则基于异步事件循环,专为高并发长连接场景优化。三者在请求处理生命周期、数据持久化方式、错误处理机制及部署模型上存在根本性分野。技术选型不应聚焦语法差异,而需结合业务并发特征、开发迭代效率与团队工程能力综合判断。本文深入对比三框架在真实生产环境中的实现逻辑、性能边界与典型陷阱,覆盖用户注册API的

weixin_30268921的博客 412

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OpenClaw:企业级跨平台消息中枢的协议桥接原理与部署实践

消息中枢系统是现代SaaS集成的核心基础设施,其本质是实现多通讯平台(微信、QQ、钉钉、飞书)间语义一致、状态可控、可审计的消息路由与分发。它不同于传统Bot框架,不依赖官方API封装,而是通过进程注入、协议解析、内存Hook等底层技术构建跨端协议桥接层,解决消息一致性、生命周期管理、失败重试与权限隔离等工程难题。该架构天然支持高可用熔断、Token自动续期、消息幂等去重与WebSocket实时网关,适用于智能客服、工单通知、运营触达等强时效性场景。openclaw阿里云部署与openclaw本地部署工具的

soyo的专栏 728

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

从零构建自定义排行榜系统:Python Flask API与批量任务实践

排行榜系统是Web开发中常见的数据展示与激励机制,其核心原理是通过数据库存储用户积分或贡献值,并基于排序算法动态计算排名。这类系统的技术价值在于能够将抽象的行为数据转化为可视化的竞争或成就体系,从而有效驱动用户参与和社区活跃度。在工程实践中,一个健壮的排行榜系统需要提供稳定的RESTful API接口以实现与外部系统的无缝集成,并具备高效的批量任务处理能力,以应对大规模数据更新和定时计算需求。典型的应用场景包括开源项目贡献者激励、社区活动积分榜、游戏化学习平台以及企业内部团队文化建设。本文将以一个具备“慷慨

weixin_30696427的博客 354

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

基于YOLO深度学习的鱼检测系统:YOLOv8/YOLOv10/YOLOv11/YOLOv12/YOLO26五模型对比与全栈架构实现|Vue3+SpringBoot+Flask+MySQL

鱼检测系统采用 Flask + Vue 前后端分离架构,集成 YOLOv8、YOLOv10、YOLOv11、YOLOv12、YOLO26 五大模型,在同一份鱼类数据集上完成横向对比训练。文章详述技术选型、数据集构建、训练流程、前后端关键实现(图片/视频/摄像头检测、模型对比、在线训练、AI 建议)及工程踩坑经验。对比结果显示 YOLOv11、v12 为第一梯队,YOLOv8 稳健,YOLOv10 无 NMS 优势未显,YOLO26 表现低于预期。为 YOLO 落地提供数据驱动的选型参考。

斌擎科技 612

基于ESP32 C6与讯飞星火大模型的智能家居语音控制实战

在物联网与智能家居领域,实现自然、精准的设备控制是核心诉求。传统方案依赖固定的语音指令或复杂的本地语义理解模型,开发门槛高且灵活性差。其技术原理在于,设备通过无线网络接收指令,经解析后驱动执行器(如舵机、LED)完成动作。随着大语言模型(LLM)技术的成熟,其强大的自然语言理解能力为智能交互带来了革新。通过大模型的Function Call(函数调用)能力,开发者无需训练专用模型,只需用自然语言描述硬件功能,模型即可从用户模糊的指令中自动解析出结构化参数,极大降低了开发复杂度并提升了用户体验。这一技术价值在

weixin_30357231的博客 516

基于YOLO的车辆类型检测系统:deepseek+千问+YOLOv8/YOLOv10/YOLOv11/YOLOv12/YOLO26模型对比|Vue3+SpringBoot+Flask+MySQL网页版

回到开头那个问题:为什么又做了一个车辆检测系统?市面上的车辆检测 Demo 多的是,但真正把"多模型对比 + 完整业务闭环 + 可追溯记录 + 在线训练"这几件事凑齐的,其实不多。这套系统的价值不在于"它能检测车辆"——这事儿随便一个 YOLO Demo 都能干——而在于它把检测做成了一个可运营、可治理、可演进的平台。对使用者来说,它是一个能直接拿去演示和落地的车辆类型检测产品;对研究者来说,它是一个 YOLO 多版本横向对比的实验台;

斌擎科技 833

从零到一打造企业级实时通信服务器

基于 Flask + Socket.IO + Redis 的多应用即时通讯系统架构与实现

qq_41590514的博客 390

局域网文件传输工具 v2.0 发布:新增 PC 互联功能,支持文件夹批量传输!

局域网文件传输工具 v2.0 发布,新增PC互联和文件夹批量传输功能。

weixin_37815019的博客 311
上一篇: 【AI论文】Transformers in Time Series: A Survey
下一篇: 【生物医学】应激(应激反应)全身适应综合征
黑符石
博客等级 码龄10年 489粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑符石

感谢小主对原创的大力支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值