Flask-SocketIO服务端安装及使用代码示例


Posted in Python onNovember 26, 2020

安装Flask-Sockets很容易:

pip install flask-socketio

注意Flask-SocketIO依赖gevent库,目前它仅可以在python2上运行(译者注:python3.6测试也可以)。gevent很快也会对python3支持。

下面是一个Flask-SocketIO在Flask应用上的实现例子:

from flask import Flask, request, jsonify,render_template
from flask_socketio import SocketIO, emit


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)


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

#触发事件my event:回复只发送此连接
@socketio.on('my_event', namespace='/chat')
def test_message(message):
  print(message)
  emit('my_response', {'data': message['data']})


#触发事件my broadcast event::回复所有链接(广播)
@socketio.on('my_broadcast event', namespace='/chat')
def test_message(message):
  print(message)
  emit('my_response', {'data': message['data']}, broadcast=True)

##################################################################
#自动连接和自动断开触发
@socketio.on('connect', namespace='/chat')
def test_connect():
  print("连接到来")
  emit('my_response', {'data': 'Connected'})

@socketio.on('disconnect', namespace='/chat')
def test_disconnect():
  print("连接断开")
  print('Client disconnected')

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

对应的test.html,注意一个问题:flask是从与启动文件同级的templates查找模板的。

test.html

官方完整示例

#!/usr/bin/env python
from threading import Lock
from flask import Flask, render_template, session, request, \
  copy_current_request_context
from flask_socketio import SocketIO, emit, join_room, leave_room, \
  close_room, rooms, disconnect

# Set this variable to "threading", "eventlet" or "gevent" to test the
# different async modes, or leave it set to None for the application to choose
# the best option based on installed packages.
async_mode = None

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, async_mode=async_mode)
thread = None
thread_lock = Lock()

def background_thread():
  """Example of how to send server generated events to clients."""
  count = 0
  while True:
    socketio.sleep(100)
    count += 1
    socketio.emit('my_response',
           {'data': 'Server generated event', 'count': count},
           namespace='/test')

@app.route('/')
def index():
  return render_template('test1.html', async_mode=socketio.async_mode)

@socketio.on('my_event', namespace='/test')
def mtest_message(message):
  print(message)
  session['receive_count'] = session.get('receive_count', 0) + 1
  # print(message)
  # print(message['data'])
  emit('my_response',
     {'data': message['data'], 'count': session['receive_count']})

@socketio.on('my_broadcast_event', namespace='/test')
def mtest_broadcast_message(message):
  print(message)
  session['receive_count'] = session.get('receive_count', 0) + 1
  emit('my_response',
     {'data': message['data'], 'count': session['receive_count']},
     broadcast=True)

@socketio.on('join', namespace='/test')
def join(message):
  print(message)
  join_room(message['room'])
  session['receive_count'] = session.get('receive_count', 0) + 1
  emit('my_response',
     {'data': 'In rooms: ' + ', '.join(rooms()),
     'count': session['receive_count']})

@socketio.on('leave', namespace='/test')
def leave(message):
  print(message)
  leave_room(message['room'])
  session['receive_count'] = session.get('receive_count', 0) + 1
  emit('my_response',
     {'data': 'In rooms: ' + ', '.join(rooms()),
     'count': session['receive_count']})

@socketio.on('close_room', namespace='/test')
def close(message):
  session['receive_count'] = session.get('receive_count', 0) + 1
  emit('my_response', {'data': 'Room ' + message['room'] + ' is closing.',
             'count': session['receive_count']},
     room=message['room'])
  close_room(message['room'])

@socketio.on('my_room_event', namespace='/test')
def send_room_message(message):
  session['receive_count'] = session.get('receive_count', 0) + 1
  emit('my_response',
     {'data': message['data'], 'count': session['receive_count']},
     room=message['room'])


##################################################################
#自动连接和自动断开触发
@socketio.on('connect', namespace='/test')
def test_connect():
  print("连接到来")
  emit('my response', {'data': 'Connected'})

@socketio.on('disconnect', namespace='/test')
def test_disconnect():
  print("连接断开")
  print('Client disconnected')


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

test1.html

<!DOCTYPE HTML>
<html>
<head>
  <title>Flask-SocketIO Test</title>
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
  <script type="text/javascript" charset="utf-8">
      $(document).ready(function(){
     var socket = io.connect('http://' + document.domain + ':' + location.port + '/test');
       socket.on('my_response', function(msg) {
         $('#log').append('<p>Received: ' + msg.data + '</p>');
    });

      $('form#emit').submit(function(event) {
        socket.emit('my_event', {data: $('#emit_data').val()});
        return false;
      });
      $('form#broadcast').submit(function(event) {
        socket.emit('my_broadcast_event', {data: $('#broadcast_data').val()});
        return false;
      });
      $('form#join').submit(function(event) {
        socket.emit('join', {room: $('#join_room').val()});
        return false;
      });
      $('form#leave').submit(function(event) {
        socket.emit('leave', {room: $('#leave_room').val()});
        return false;
      });
      $('form#send_room').submit(function(event) {
        socket.emit('my_room_event', {room: $('#room_name').val(), data: $('#room_data').val()});
        return false;
      });
      $('form#close').submit(function(event) {
        socket.emit('close_room', {room: $('#close_room').val()});
        return false;
      });
      $('form#disconnect').submit(function(event) {
        socket.emit('disconnect_request');
        return false;
      });
    });
  </script>
</head>
<body>
  <h1>Flask-SocketIO Test</h1>
  <p>Async mode is: <b>{{ async_mode }}</b></p>
  <p>Average ping/pong latency: <b><span id="ping-pong"></span>ms</b></p>
  <h2>Send:</h2>
  <form id="emit" method="POST" action='#'>
    <input type="text" name="emit_data" id="emit_data" placeholder="Message">
    <input type="submit" value="Echo">
  </form>
  <form id="broadcast" method="POST" action='#'>
    <input type="text" name="broadcast_data" id="broadcast_data" placeholder="Message">
    <input type="submit" value="Broadcast">
  </form>
  <form id="join" method="POST" action='#'>
    <input type="text" name="join_room" id="join_room" placeholder="Room Name">
    <input type="submit" value="Join Room">
  </form>
  <form id="leave" method="POST" action='#'>
    <input type="text" name="leave_room" id="leave_room" placeholder="Room Name">
    <input type="submit" value="Leave Room">
  </form>
  <form id="send_room" method="POST" action='#'>
    <input type="text" name="room_name" id="room_name" placeholder="Room Name">
    <input type="text" name="room_data" id="room_data" placeholder="Message">
    <input type="submit" value="Send to Room">
  </form>
  <form id="close" method="POST" action="#">
    <input type="text" name="close_room" id="close_room" placeholder="Room Name">
    <input type="submit" value="Close Room">
  </form>
  <form id="disconnect" method="POST" action="#">
    <input type="submit" value="Disconnect">
  </form>
  <h2>Receive:</h2>
  <div id="log"></div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python语言的面相对象编程方式初步学习
Mar 12 Python
Python入门_学会创建并调用函数的方法
May 16 Python
Django入门使用示例
Dec 12 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
python requests post多层字典的方法
Dec 27 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
Jul 11 Python
django框架模型层功能、组成与用法分析
Jul 30 Python
Python对接 xray 和微信实现自动告警
Sep 17 Python
Python类反射机制使用实例解析
Dec 30 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
Jun 23 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 #Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 #Python
Django-celery-beat动态添加周期性任务实现过程解析
Nov 26 #Python
Django celery异步任务实现代码示例
Nov 26 #Python
Django通过设置CORS解决跨域问题
Nov 26 #Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 #Python
python模拟点击在ios中实现的实例讲解
Nov 26 #Python
You might like
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
PHP的引用详解
2015/02/22 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
JavaScript常见的五种数组去重的方式
2016/12/15 Javascript
js实现表格筛选功能
2017/01/18 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
Python对切片命名的实现方法
2018/10/16 Python
python按照多个条件排序的方法
2019/02/08 Python
Python数据类型之List列表实例详解
2019/05/08 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
Python实现弹球小游戏
2020/08/01 Python
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
大学生四个方面的自我评价
2013/09/19 职场文书
模具数控专业自荐信
2014/01/27 职场文书
优秀毕业生求职信
2014/06/05 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android