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

效果图

先看运行效果图
图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 SocketIOservice_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_stateservice_state = 0while 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_stateservice_state = 9return 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】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8977.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

logback日志框架基本知识

本文来说下logback日志框架基本知识 文章目录 概述logback简介SpringBoot对logback的支持SpringBoot的集成SpringBoot对logback的基础配置自定义logback配置本文小结 概述 Spring Boot已经将logback做为默认集成的日志框架&#xff0c;全面了解学习是必然了。曾经log4j是流行的…

react—Hook(2)

6. useMemo—似计算属性 useMemo和useCallback的作用十分类似&#xff0c;只不过它允许记住任何类型的变量&#xff08;useCallback只记住函数&#xff09;。当改变其他变量时&#xff0c;普通函数都会运行&#xff0c;它返回的结果并没有改变。这个时候就可以使用useMemo将函…

HTML 编辑器的介绍及推荐

HTML 编辑器 HTML 编辑器是用于编写 HTML 的工具&#xff0c;使用 HTML 编辑器时以编辑主题&#xff0c;索引&#xff0c;自定义窗口&#xff0c;选择添加搜索页。 使用 Notepad 或 TextEdit 来编写 HTML 下列是三种专门用于编辑 HTML 的 HTML 编辑器&#xff1a; Adobe Dream…

使用SDWAN构建安全的混合WAN

使用SD-WAN构建安全的混合WAN SDWAN的爆炸已成为头条新闻了一年多。企业正在以惊人的速度采取SDWAN&#xff0c;不但可以为分支机构提供更灵活的连接和利用程序性能&#xff0c;而且可以跨全部网络提供。远程“超级用户”依托SDWAN(通过将小型台式机装备提供的安全性&#xff…

【go】数据表转csv

文章目录 1 基本结构1.1 数据1.2 数据结构 2 代码3 tip 1 基本结构 1.1 数据 1.2 数据结构 2 代码 代码&#xff1a; package mainimport ("database/sql""encoding/csv""fmt"_ "github.com/go-sql-driver/mysql""log"&q…

大数据面试题:Kafka的Message包括哪些信息

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 参考答案&#xff1a; 一个 Kafka 的 Message 由一个固定长度的 header 和一个变长的消息体 body 组成&#xff0c;header 部分由一个字节的 magic&…

进阶课程1:jvm内存模型

目录 JVM内存结构转换总结一下 JVM整体结构线程栈 JVM栈内存结构栈帧操作数栈局部变量表 JVM堆内存结构堆内存非堆内存 JMM内容&#xff1a;讲解JMM的三大特性1.原子性2.可见性3.有序性 视频 JVM内存结构 JVM内部由线程栈和堆内存组成。 简单描述就是我们的原生类型的局部变量…

Hive基础知识

1.Hive简介 Hive是由Facebook开源用于解决海量结构化日志的数据统计工具。Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。 2.Hive本质 Hive的本质是将HQL转化成MapReduce程序。 Hive处理的数据存储在H…

基于线性准则的考虑风力发电不确定性的分布鲁棒优化机组组合(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Centos7部署项目

Centos7部署项目 Centos7部署项目Centos7安装gitCentos7从github拉取代码配置git配置用于提交代码的用户名配置用户邮箱生成公钥效果如下 github添加SSH key打开你的GitHub获取ssh key公钥内容验证 拉取项目新建空白文件夹拉取项目 使用Docker Compose创建项目容器创建docker-c…

基于minsit数据集的图像分类任务|CNN简单应用项目

Github地址 Image-classification-task-based-on-minsit-datasethttps://github.com/Yufccode/CollegeWorks/tree/main/ImageProcessing/Image-classification-task-based-on-minsit-dataset README 摘要 本次实验报告用两种方式完成了基于minst数据集完成了图像的分类任务…

深度解读AIGC存储解决方案

5月26日&#xff0c;2023数据基础设施技术峰会在苏州举办&#xff0c;腾讯云首席存储技术专家温涛受邀出席并分享了腾讯云领先的存储技术在AIGC场景中的应用&#xff0c;通过对AIGC业务流程和场景的提炼&#xff0c;从内容生成、内容审核和内容智理三要素介绍了如何智能的存储和…