如何在mod\wsgi下控制werkzeug中http分块的使用

2024-09-29 17:14:36 发布

您现在位置:Python中文网/ 问答频道 /正文

在以下环境下:Apache->mod\wsgi->python->werkzeug

我如何控制是否使用httpckunking以及块有多大?在

跟进:

我担心的是这两者之间的区别:

response = werkzeug.wrappers.Response()
response.response = very_long_string
return response

还有这个:

^{pr2}$

在第一种情况下,werkzeug遍历字符串,一次发送一个字符。我不知道是否每个字符都是在自己的块中发送的,但我知道这比第二种情况下字符串作为一个整体发送要慢得多。在

这两个案例的速度差异是不是因为分块?或者是别的什么?在


Tags: 字符串modwsgi环境responseapache情况字符
1条回答
网友
1楼 · 发布于 2024-09-29 17:14:36

一般来说,wsgi指定只要应用程序生成响应内容的任何部分,就应该将数据发送到客户端,而不进行缓冲;例如,如果您这样做了:

CONTENT = "a bit more content\n"

def my_slow_application(environ, start_response):
    start_response("200 OK", [("Content-Type", "text/plain")])
    yield CONTENT
    sleep(1)

值得注意的是,如果没有Content-Length报头,网关(在您的例子中是apache/mod_wsgi)无法猜测它已经找到了所有的响应内容,而且由于不允许缓冲,它必须使用分块传输编码。在

另一方面,考虑:

^{pr2}$

由于应用程序指定了内容长度,并且由于第一个yielded块正好是这个长度,网关知道不会有更多的数据;它可以使用也可以不使用分块编码,这是由它自己决定的。同样

def my_fast_application(environ, start_response):
    start_response("200 OK", [("Content-Type", "text/plain")])
    return [CONTENT] * 100

通常不会导致分块;响应是一个列表,其大小有界,因此网关知道它有整个响应。它甚至可以使用sum(map(len, app_iter))从应用程序中找到内容长度,然后以网络允许的速度发送响应。在


至于控制块有多大,如果客户端连接被阻止,网关可能会缓冲块;你的应用可能会

yield "foo"
sleep(1)
yield "bar"
sleep(1)
yield "baz"

但是,如果客户端连接在处理“foo”块时阻塞,网关可能会将bar和baz缓冲在一起,在连接准备好再次读取时将它们作为单个块发送。简而言之,你不能控制分块,你可以强迫它发生,你可以经常阻止它的发生(如果不需要的话,大多数网关就不会分块);但是它不适合于分帧。在

相关问题 更多 >

    热门问题