【发布时间】:2018-10-11 23:38:27
【问题描述】:
我正在尝试将我的烧瓶应用程序上的输出从我的服务器连续流式传输到客户端(webapp)。我可以通过打开一个 ajax 请求并像这样打开它来成功地流式输出:
//Open up a stream
let url = '/stream';
xhr.open('GET', url);
xhr.send(fd);
//Display it like this
data = xhr.responseText;
$(".myTextArea").val(data);
我可以通过这样做来关闭这个 ajax 请求(但我让它保持打开状态):
xhr.readyState == XMLHttpRequest.DONE
//do stuff
但我也可以使用 websockets (flask_socketio) 不断轮询服务器输出流到客户端。
这两种轮询方法在性能方面是否相同?
这是我从远程服务器收集 AJAX 流的方式:
let streamTimer;
function stream(){
let xhr;
let streamData;
let lastStreamData;
xhr = new XMLHttpRequest();
const url = '/stream';
xhr.open('GET', url);
xhr.send();
let streamTimer = setInterval(function() {
streamData = xhr.responseText;
if (lastStreamData !== streamData) {
console.log(streamData)
lastStreamData = streamData;
}
}, 1000);
}
我的 ajax 调用我的烧瓶路由 stream(),它基本上使用 -f 选项跟踪日志,这样它将保持连接打开。如果日志有输出,那么它会将其发送回我的 ajax 调用并显示在网页上。
def stream():
def generate():
if request.method == "POST":
hostname = request.data.decode('utf-8')
# ssh set up
client = set_up_client()
# Connect to hostname
client.connect(hostname, username=USERNAME,
password=PASSWORD)
cmd = ('tail -f -n0 /home/server.log')
stdin, stdout, stderr = client.exec_command(cmd)
for line in iter(lambda: stdout.readline(2048), ""):
print(line, end="")
yield line
if re.search(r'keyword1|keyword2', line):
print('change detected')
yield 'change detected\n'
return Response(stream_with_context(generate()), mimetype='text/html')
【问题讨论】:
标签: ajax python-3.x flask websocket socket.io