Я пытаюсь транслировать события, отправленные сервером, из своего приложения Pyramid, но не могу понять, как транслировать тело ответа из моего представления. Вот тестовый вид, который я использую (он полностью не реализует SSE, он просто работает с потоковой частью):
@view_config(route_name='iter_test')
def iter_test(request):
import time
def test_iter():
i = 0
while True:
i += 1
if i == 5:
raise StopIteration
yield str(time.time())
print time.time()
time.sleep(1)
return test_iter()
Это производит ValueError: Could not convert return value of the view callable function pdiff.views.iter_test into a response object. The value returned was <generator object test_iter at 0x3dc19b0>.
Вместо этого я попробовал return Response(app_iter=test_iter())
, который, по крайней мере, не выдает ошибку, но не передает ответ - он ждет, пока генератор не завершит работу, прежде чем вернуть ответ моему браузеру.
Я понимаю, что можно было бы просто вернуть одно событие на запрос и позволить клиентам повторно подключаться после каждого события, но я бы предпочел сохранить природу событий, отправленных сервером в реальном времени, путем потоковой передачи нескольких событий из одного запроса без задержки повторного подключения. Как я могу сделать это с помощью пирамиды?