2012-07-22 2 views
6

Ниже приведен ответ, используя node.js.Как закрыть соединение Server-Send Events в Flask?

How to close a "Server-Sent Events"-connection on the server?

Однако, как сделать то же самое в питона термос?

+0

Кажется, что у автора Flask нет плана по его поддержке. Для «Server-Sent Events» лучше использовать управляемую событиями архитектуру, такую ​​как NodeJS. – hllau

+0

[этот комментарий] (http://stackoverflow.com/questions/32273937/how-to-redirect-when-server-sent-event-is-finished-in-flask-on-server-side#comment52434617_32275299) также был очень полезно для аналогичного вопроса – colidyre

ответ

3

Ну, это зависит от архитектуры вашего приложения.

Позвольте мне показать вам пример (см этот код на https://github.com/jkbr/chat/blob/master/app.py):

def event_stream(): 
    pubsub = red.pubsub() 
    pubsub.subscribe('chat') 
    for message in pubsub.listen(): 
     print message 
     yield 'data: %s\n\n' % message['data'] 

@app.route('/stream') 
def stream(): 
    return flask.Response(event_stream(), 
          mimetype="text/event-stream") 

Колба требующему новое сообщение для Redis (блокировка работы) устойчиво, но когда колба видит, что потоковое заканчивается (StopIteration, если не являются новыми для Python), он возвращается.

def event_stream(): 
    pubsub = red.pubsub() 
    pubsub.subscribe('chat') 
    for message in pubsub.listen(): 
     if i_should_close_the_connection: 
      break 
     yield 'data: %s\n\n' % message['data'] 

@app.route('/stream') 
def stream(): 
    return flask.Response(event_stream(), 
          mimetype="text/event-stream") 
+0

Что такое 'i_should_close_the_connection'? Не могли бы вы объяснить немного больше? – hllau

+0

Это логическое значение. Вы можете использовать этот оператор 'if', как и в Python. – gioi

+0

Дайте мне код, и я был бы рад помочь. – gioi