【发布时间】:2022-01-01 05:53:11
【问题描述】:
我的目标是让我的 Flask 服务器每三秒或在调用函数时发送客户端数据。为此,我正在使用 SocketIO。但是,根据我正在使用的一些示例代码,我似乎只能在客户端请求某些内容后发送数据。我不希望客户端必须“轮询”来查找是否有新数据,所以我希望服务器在准备好时推送它。
这是我到目前为止所尝试的。 (有些代码是不必要的,因为它基于一个示例)这应该使用 socketio 每隔几秒将时间推送到客户端。
HTML
<!DOCTYPE HTML>
<html>
<head>
<title>Socket-Test</title>
<script src="//code.jquery.com/jquery-1.12.4.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
namespace = '/test';
var socket = io(namespace);
socket.on('my_response', function(msg, cb) {
$('#log').text( $('<div/>').text(msg.data).html());
if (cb)
cb();
});
});
</script>
</head>
<body style="background-color:white;">
<h1 style="background-color:white;">Socket</h1>
<div id="time" ></div>
</body>
</html>
Python
import threading
from flask import Flask, render_template, session, copy_current_request_context,request
from flask_socketio import SocketIO, emit, disconnect
from threading import Lock
import time
async_mode = None
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socket_ = SocketIO(app, async_mode=async_mode)
thread = None
thread_lock = Lock()
clients = []
def update():
time.sleep(1)
emit('my_response',
{'data': time.time},
room=clients[0])
t=threading.Thread(target=update)
@socket_.on('connect')
def handle_connect():
print('Client connected')
clients.append(request.sid)
t.start()
@app.route('/')
def index():
return render_template('index.html', async_mode=socket_.async_mode)
@socket_.on('my_event', namespace='/test')
def test_message(message):
session['receive_count'] = session.get('receive_count', 0) + 1
emit('my_response',
{'data': message['data'], 'count': session['receive_count']})
@socket_.on('my_broadcast_event', namespace='/test')
def test_broadcast_message(message):
session['receive_count'] = session.get('receive_count', 0) + 1
emit('my_response',
{'data': time.time},
broadcast=True)
socket_.run(app,port=8050)
我尝试运行它,但它给了我错误RuntimeError: Working outside of request context.
【问题讨论】:
-
您需要
socket_.emit以避免使用上下文。而且您的 Javascript 代码似乎正在寻找一个 ID 为log的标签,我在您的 HTML 中没有看到。
标签: python html sockets flask socket.io