安装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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持免费资源网。
© 版权声明
THE END
暂无评论内容