基于flask_socketio实现websocket,实时向页面推送消息

基于socketio实现websocket

后端代码

socket_data={}
num1=1

def stage_connect():
    while True:
        socketio.sleep(1)
        global num1
        global socket_data
        if type(socket_data)==unicode:
            socket_data=json.loads(socket_data)
        if len(socket_data) == 0:
            socket_data = {'text': '', 'Sdate': '', 'Edate': ''}
        new_num=counts(u"""select count(*) as c from tsgz_log""")
        if int(new_num[0]['c'])!=int(num1):
            l=logs(socket_data['text'],socket_data['Sdate'],socket_data['Edate'])
            socketio.emit('log',
                          {'data': l},
                          namespace='/stage/log_websocket')
            num1=new_num[0]['c']
        else:
            pass

socket连接,主动连接
@socketio.on('connect', namespace='/stage/log_websocket')
def connect():
    socketio.start_background_task(target=stage_connect)

接收前端发送的参数,my_event是事件名称,接收指定事件名的参数
@socketio.on('my event',namespace='/stage/log_websocket')
def my_event(data):
    global socket_data
    socket_data=data
    
if __name__ == '__main__':
    # app = create_app()
    # app.run(host='0.0.0.0', debug=True, port=5002)
    app = create_app()
    socketio.run(app, debug=True, port=5002, host='0.0.0.0')

前端代码

连接到指定的命名空间
var namespace = '/stage/log_websocket';
socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + 	  namespace);

向指定的命名事件发送数据
socket.emit('my_event',data)

接收指定事件发送过来的数据
socket.on('log', function(res) {
	            that.list = res.data.list
	        });


<script src="js/islogin.js" type="text/javascript" charset="utf-8"></script>
<link rel="stylesheet" type="text/css" href="css/bootstrap-datepicker3.standalone.min.css"/>
<div class="log-box" id="log">
	<!--搜索条件-->
	<div class="log-search">
		<div class="user-search-box">
			<input type="text" placeholder="" v-model="text" class="border-box"> 
			<span>开始时间</span> 
			<input type="text" class="border-box datepicker" v-model="Sdate" tab="Sdate"/>
			<span>结束时间</span>
			<input type="text" class="border-box datepicker" v-model="Edate" tab="Edate"/>
			<div class="user-search-btn" v-on:click="query"><span>搜索</span></div>
			<span class="glyphicon glyphicon-repeat" title="清空条件"></span>
		</div>
	</div>
	<div class="scroll">
		<ul>
			<li v-for="item in list" :key="item.id"><b></b><span>{{item}}</span></li>
		</ul>
	</div>
</div>
<script src="js/bootstrap-datepicker.min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/bootstrap-datepicker.zh-CN.min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/socket_io.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
	var namespace = '/stage/log_websocket';
	socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace);
	var v = new Vue({
		el:"#log",
		data:{
			text:"",
			Sdate:"",
			Edate:"",
			list:[]
		},
		mounted(){
			this.init()
		},
		methods:{
			//查询
			query(){
				var that = this
				var data = JSON.stringify({text:that.text,Sdate:that.Sdate,Edate:that.Edate})
				$.ajax({
					type:"get",
					url:urll+"stage/logs?text="+that.text+"&Sdate="+that.Sdate+"&Edate="+that.Edate,
					async:true,
					success:function(result){
						if(result.error_code==0){
		                	that.list = result.list
		                	pro_back(result.message)
							socket.emit('my event',data)
		                }else{
		                	pro_back(result.message)
		                }
					},
					error:function(){},
				});
			},
			init(){
				var that = this;
				//时间插件初始化
				$(".datepicker").datepicker({
				    language: "zh-CN",
				    format: 'yyyy-mm-dd',
				    clearBtn: true,
					autoclose: true,
				}).on("changeDate",function(e){
					that[$(this).attr("tab")] = $(this).val()
				});
				$.ajax({
					type:"get",
					url:urll+"stage/logs?text=&Edate=&Sdate=",
					async:true,
					success: function(result) {
		                if(result.error_code==0){
		                	that.list = result.list
		                	pro_back(result.message)
		                }else{
		                	pro_back(result.message)
		                }
		            },
		            error:function(xhr){console.log(xhr)}
				});
				socket.on('log', function(res) {
		            that.list = res.data.list
		        });
			}
		}
	})
</script>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值