flask使用socketio的后端与前端(网页)实时交互

工程原因需要后端实时推送数据到前端,并在前端进行相应的显示响应

项目架构

 static存放css、js、images等静态数据

templates存放html网页文件

实现

后端main.py

from flask_socketio import SocketIO
from flask import Flask, render_template, request
from threading import Lock

thread = None
thread_lock = Lock()
app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins='*')
connected_sids = set()  # 存放已连接的客户端

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

@socketio.on('connect')
def on_connect():
    connected_sids.add(request.sid)
    print(f'{request.sid} 已连接')
    global thread
    with thread_lock:
        print(thread)
        if thread is None:
            # 如果socket连接,则开启一个线程,专门给前端发送消息
            thread = socketio.start_background_task(target=background_thread)


@socketio.on('disconnect')
def on_disconnect():
    connected_sids.remove(request.sid)
    print(f'{request.sid} 已断开')


@socketio.on('message')
def handle_message(message):
    """收消息"""
    data = message['data']
    print(f'{request.sid} {data}')

#后端程序
def background_thread():
    """
    该线程专门用来给前端发送消息
    :return:
    """
    num = 0
    while True:
        socketio.emit('server_response',{'data': num%16+1})
        socketio.sleep(2)
        num+=1

if __name__ == '__main__':
    socketio.run(app, host='127.0.0.1', port=8083, debug=True)

前端index.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>demo</title>
    <script src="https://cdn.staticfile.org/jquery/3.6.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/socket.io/4.5.2/socket.io.min.js"></script>
    <link href="../static/css/locationGrid.css" rel="stylesheet">
</head>
<h2 id ="nowloc">当前:</h2>
<body>
<div class="container">
  <div id="loc1">1</div>
  <div id="loc2">2</div>
  <div id="loc3">3</div>
  <div id="loc4">4</div>
  <div id="loc5">5</div>
  <div id="loc6">6</div>
  <div id="loc7">7</div>
  <div id="loc8">8</div>
  <div id="loc9">9</div>
  <div id="loc10">10</div>
  <div id="loc11">11</div>
  <div id="loc12">12</div>
  <div id="loc13">13</div>
  <div id="loc14">14</div>
  <div id="loc15">15</div>
  <div id="loc16">16</div>
</div>
<script>
    var socket = io();
    //记录上一次显示位置
    var lastloc = null;
    socket.on("connect", function () {
        
    });
    
    socket.on("server_response", function (msg) {
       	//接收到后端发送过来的消息
        var t = msg.data;
        $("#nowloc").text("当前位置:"+t);
        //恢复上一次显示位置为正常颜色
        $("#loc"+lastloc).css("background-color", "#b5f1f7");
        $("#loc"+t).css("background-color", "red");
        lastloc = t;
    });

</script>
</body>
</html>

css文件

* {
  margin: 0px;
}
.container {
  /* 设置为网格布局,并且占据页面一整行 */
  display: grid;
  /* 设置网格列数 这里设置为4行4列,每格长宽为100px */
  grid-template-columns: 100px 100px 100px 100px;
  grid-template-rows: 100px 100px 100px 100px;
  /* 容器中间对齐网格 */
  justify-content: center;
  align-content: center;
  /* 设置网格项目间间隙 */
  gap: 1px 1px;
  padding: 10px;
  /* 网格内单元格垂直位置 */
  /*align-items:center;*/
}

.container > div {
  border: 1px solid white;
  text-align: center;
  align-items: center;
  font-size: 20px;
  background-color: #b5f1f7;
}

 部分运行结果

参考文章

利用flask-socketio实现前后端实时通信的功能

用Python Flask为女朋友做一个简单的网站

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值