Python 每次事件发生后,连接都会关闭
我使用以下代码实现javascript EventSource的后端Python 每次事件发生后,连接都会关闭,python,flask,streaming,server-sent-events,Python,Flask,Streaming,Server Sent Events,我使用以下代码实现javascript EventSource的后端 来自烧瓶导入烧瓶,响应 从时间上导入睡眠 导入时间 类ServerSentEvent(对象): 定义初始化(自身,数据): self.data=数据 self.event=None self.id=None self.desc_映射={ self.data:“数据”, self.event:“事件”, self.id:“id”, self.retry:500 } def编码(自): 如果不是自我数据: 返回“” 行=[%s:%
来自烧瓶导入烧瓶,响应
从时间上导入睡眠
导入时间
类ServerSentEvent(对象):
定义初始化(自身,数据):
self.data=数据
self.event=None
self.id=None
self.desc_映射={
self.data:“数据”,
self.event:“事件”,
self.id:“id”,
self.retry:500
}
def编码(自):
如果不是自我数据:
返回“”
行=[%s:%s”%(v,k)
对于k,self.desc_map.items()中的v,如果k]
返回“%s\n\n”%“\n”。加入(行)
def stream():
尽管如此:
ev=ServerSentEvent('hi'+str(int(round(time.time()))))
产量ev
睡眠(0.1)
app=烧瓶(名称)
@应用程序路径(“/events”)
def streamSessionEvents():
返回响应(stream(),mimetype=“text/event stream”)
@附件路线(“/”)
def index():
模板=“”“
var source=new EventSource(“/events”)
source.onmessage=函数(事件){
$(“#日志”).append(event.data+”)
}
"""
返回(模板)
app.run(threaded=True)
但是,EventSource会每3秒(默认值)重新连接一次,因为每次事件发生后服务器都会关闭连接。如何建立连续连接
from flask import Flask, Response
from time import sleep
import time
class ServerSentEvent(object):
def __init__(self, data):
self.data = data
self.event = None
self.id = None
self.desc_map = {
self.data : "data",
self.event : "event",
self.id : "id",
self.retry: 500
}
def encode(self):
if not self.data:
return ""
lines = ["%s: %s" % (v, k)
for k, v in self.desc_map.items() if k]
return "%s\n\n" % "\n".join(lines)
def stream():
while True:
ev = ServerSentEvent('hi ' + str(int(round(time.time()))))
yield ev
sleep(0.1)
app = Flask(__name__)
@app.route("/events")
def streamSessionEvents():
return Response(stream(), mimetype="text/event-stream")
@app.route("/")
def index():
template = """
<!doctype html>
<html>
<head>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
var source = new EventSource('/events')
source.onmessage = function (event) {
$('#log').append(event.data + '</br>')
}
</script>
</head>
<body>
<div id="log"></div>
</body>
</html>
"""
return(template)
app.run(threaded=True)