Я написал следующий код тестирования для веб-сайта.Индекс показывает относительно пустую страницу, но он откроет поток, из которого он сможет получать больше сообщений от сервера, эффективно позволяя мне делать события на стороне сервера.Для этого мне нужно вставить генератор в объект 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
Возможно ли создать такую функцию?Есть ли лучший способ решить эту проблему?Вместо этого вы бы рекомендовали поискать альтернативу генератору?Первый вариант не так плох, как кажется, и если да, то почему?