我已经为网站编写了以下测试代码。索引显示了一个相对空白的页面,但是它将打开一个流,可以从该流中接收来自服务器的更多消息,从而有效地允许我进行服务器端事件。为此,我需要在Response
对象中插入一个生成器。
from flask import Flask, Response, render_template
app = Flask(__name__)
def answer():
while True:
q = input("Whaddaya wanna say? ")
yield 'data: {} \n\n'.format(q)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/stream')
def stream():
return Response(answer(), mimetype="text/event-stream")
if __name__ == "__main__":
app.run(threaded=True, debug=True)
与名为index.html
的文件一起使用,效果很好。我收到输入给终端的任何文本。但是,如果第二个用户访问服务器,Python将在两个用户之间来回移动-一些输入将发送给一个用户,下一个输入将始终发送给另一个用户。我知道这是应该的工作方式,但是我想知道是否有可能创建一个可以满足所有客户需求的生成器。
目前,我可以想到两种可行的方法。第一个不太复杂,但是我不确定将其付诸实践是否是一个好主意。在这里,将创建一个Messenger
实例,然后将其ànswer()
函数作为生成器。
class Messenger:
def __init__(self):
self.message = ""
def send_msg(self,msg):
self.message = msg
def answer(self):
current_message = self.message
while True:
# Yield when the message has been updated
if self.message != current_message:
current_message = self.message
yield current_message
由于两个原因,我不太喜欢此代码。首先,它不允许用户连续两次发送相同的消息。第二,经常检查似乎浪费了很多时间检查东西。一定有更好的方法。有吗?
我一直在尝试多种方法,但我想不起任何方法。我也无法在互联网上找到任何解决方案。我目前的猜测是要以某种方式使函数等待更新完成。如下所示,尽管我不知道如何完成这段代码。
class Messenger:
def __init__(self):
self.message = ""
def send_msg(self,msg):
self.message = msg
def answer(self):
while True:
pass # Pause function until send_msg() is executed
yield self.message
是否可以创建这样的功能?有没有更好的方法来解决此问题?您是否会建议寻找替代发电机的替代方案?第一种选择不是看起来那么糟糕,如果是,为什么?