当前位置: 首页 > 知识库问答 >
问题:

金字塔流响应体

慕烨烁
2023-03-14

我试图从我的金字塔应用程序中流式传输服务器发送的事件,但是我不知道如何从我的视图中流式传输响应主体。这是我正在使用的测试视图(它完全没有实现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:无法转换视图可调用函数pdiff的返回值。意见。将iter_测试转化为响应对象。返回的值为

我尝试了返回响应(app_iter=test_iter()),这至少不会出错,但它不会流式传输响应-它会等到生成器完成后才将响应返回到我的浏览器。

我知道这可以简单地为每个请求返回一个事件,并允许客户端在每个事件后重新连接,但我更喜欢通过从单个请求流式传输多个事件来保持服务器发送事件的实时性,而不需要重新连接延迟。我怎样才能用金字塔做到这一点?

共有3个答案

安经纶
2023-03-14

如果没有为视图指定任何渲染器,则必须返回响应对象。金字塔响应对象有一个特殊的参数app_iter返回迭代器。所以你应该这样做:

import time
from pyramid.response import Response


@view_config(route_name='iter_test')
def iter_test(request):

    def test_iter():
        for _ in range(5):
            yield str(time.time())
            print time.time()
            time.sleep(1)

    return Response(app_iter=test_iter())

我还对你的代码进行了一些编辑,使其更具可读性。

使现代化

我尝试了返回响应(app_iter=test_iter()),它至少不会出错,但不会流化响应——它会等到生成器完成后,再将响应返回到我的浏览器。

我想问题在于缓冲。尝试发送一个非常大的迭代器。

祝花蜂
2023-03-14

我不久前做了一些测试,以尝试事件源/服务器发送的事件。我刚刚测试过,它在金字塔1.5a上仍然可以正常工作。

@view_config(route_name = 'events')
def events(request):
    headers = [('Content-Type', 'text/event-stream'),
               ('Cache-Control', 'no-cache')]
    response = Response(headerlist=headers)
    response.app_iter = message_generator()
    return response

def message_generator():
    socket2 = context.socket(zmq.SUB)
    socket2.connect(SOCK)
    socket2.setsockopt(zmq.SUBSCRIBE, '')
    while True:
        msg = socket2.recv()
        yield "data: %s\n\n" % json.dumps({'message': msg})

完整示例如下:https://github.com/antoineleclair/zmq-sse-chat.看看https://github.com/antoineleclair/zmq-sse-chat/blob/master/sse/views.py.

我不确定为什么我的能用而你的不行。也许是头球。或者在每条消息之后添加两个'\n'。顺便说一句,如果您正确地查看了事件源规范,则必须使用数据:作为每个新事件的前缀,并使用\n\n作为事件分隔符。

郑琦
2023-03-14

我发现了问题。原来我的应用程序代码是好的,问题在于服务员和nginx:

>

问题的根源被nginx隐藏了起来,nginx是我放在金字塔应用程序前面的web服务器,它也会缓冲响应。

(1) 可以通过以下方式解决:

>

  • 在. ini文件中用send_bytes=1配置服务员。这修复了流媒体问题,但使您的整个应用程序超级慢。正如@Zitrax所提到的,您可以用更高的值恢复一些速度,但是任何高于1的值都有消息卡在缓冲区中的风险。

    切换到gunicorn。我不知道gunicorn是否只是使用了更小的缓冲区,或者它是否在app_iter中表现得更好,但它工作了,并保持了我的应用程序的速度。

    (2)可以通过配置nginx来禁用流路由的缓冲来解决。

    您需要在nginx配置中设置proxy\u buffering off。此设置适用于通过proxy\u pass托管的站点。如果您没有使用proxy\u pass您可能需要不同的设置。

    >

    您也可以在nginx conf中的位置块中配置此选项。如果您正在使用除EventSource之外的其他东西,并且您不希望收到特定的标头,或者如果您正在使用EventSource,但希望从普通浏览器选项卡调试响应,在该选项卡中,您不能在请求中发送接受标头,这将是很好的。

  •  类似资料:
    • 问题内容: 我正在尝试从我的Pyramid应用程序流式传输服务器发送的事件,但是我无法从我的角度弄清楚如何流式传输响应正文。这是我正在使用的测试视图(它完全不实现SSE,仅用于计算流传输部分): 这产生 我尝试了一下,至少不会出错,但是它不会流式传输响应- 等待生成器完成后才将响应返回到我的浏览器。 我认识到,这可以简单地为每个请求返回一个事件,并允许客户端在每个事件后重新连接,但是我更喜欢通过从

    • 主要内容:金字塔向上,金字塔向下,均值移位滤镜金字塔是对图像的一种操作, 使用特定的平滑过滤器(例如高斯,拉普拉斯算子)对输入图像进行初始平滑,然后对平滑后的图像进行二次采样。 这个过程重复多次。 在金字塔操作期间,图像的平滑度增加并且分辨率(尺寸)减小。 金字塔向上 在金字塔上,图像最初被上采样然后模糊。可以使用类的方法对图像执行金字塔向上操作。 以下是这种方法的语法 - 该方法接受以下参数 - src - 表示此操作的源(输入图像)的对象

    • 目标 在这一章当中, 我们将学习图像金字塔 我们将使用图像金字塔来创建一个新的水果,“Orapple” <!--

    • 目标 在本章中, 我们将学习图像金字塔 我们将使用图像金字塔创建一个新的水果“Orapple” 我们将看到以下功能:cv.pyrUp(),cv.pyrDown() 理论 通常,我们过去使用的是恒定大小的图像。但是在某些情况下,我们需要使用不同分辨率的(相同)图像。例如,当在图像中搜索某些东西(例如人脸)时,我们不确定对象将以多大的尺寸显示在图像中。在这种情况下,我们将需要创建一组具有不同分辨率的相

    • 我正在使用nginx为服务器上的网站提供服务,配置如下: /位置只有静态html和js文件,而 /rest/位置应该转到金字塔应用程序,但该部分不起作用。 如何将/Rest/位置传递给金字塔http://localhost:6543? nginx访问日志: 127.0.0.1--[2018年9月21日:15:20:39 0800]“GET/rest HTTP/1.1”502 182“-”Mozil

    • 漏斗图往往展现的是每个阶段数据的减少情况,例如在销售中各个阶段的流失情况。 一、漏斗图 图4-13 Highcharts 漏斗图 漏斗图相关的配置参考 API 文档: 漏斗图配置:针对当前数据列有效 漏斗数据列配置 :针对当前页面的所有漏斗数据列有效 特性及常见问题 1、改变漏斗脖子大小 通过 neckWith 和 neckneckHeight 可以指定漏斗脖子的宽度和高度,其值为百分数,表示占总