现在我有一个mod_wsgi脚本,结构如下..

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

我想知道是否有人知道如何更改此操作以在 yield 基础上操作而不是 return ,这样我就可以在生成页面时发送它并且不仅一旦完成,所以用户的页面加载速度会更快。

但是,每当我将输出交换为列表并在application()中生成它时,它都会抛出错误:

TypeError: sequence of string values expected, value of type list found
有帮助吗?

解决方案

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    yield output
  

"但是,每当我将输出交换为列表并在应用程序()中生成它时,它都会抛出错误:“

好吧,不要列出清单。而是产生每个元素:

for part in mylist:
    yield part

或者如果列表是整个内容,只需:

return mylist

因为列表已经是迭代器并且可以单独生成。

其他提示

请注意,除非绝对必要,否则应避免“收益率”。特别是如果产生许多小字符串,“收益率”将是低效的。这是因为WSGI规范要求在每个字符串产生之后必须刷新响应。对于Apache / mod_wsgi,刷新意味着每个字符串通过Apache输出桶队列和过滤器系统被强制输出到套接字上。忽略Apache输出过滤器系统的开销,将大量小字符串写入套接字只是开始时很糟糕。

此问题也存在于从应用程序返回字符串数组的情况下,因为还必须在数组中的每个字符串之间执行flush。这是因为字符串被处理为可迭代而不是列表。因此,对于预先形成的字符串列表,将单个字符串连接成一个大字符串并返回仅包含该字符串的列表要好得多。这样做还允许WSGI实现自动生成响应的Content-Length(如果未明确提供响应)。

只需确保将列表中的所有字符串连接到一个字符串时,结果将在列表中返回。如果没有这样做,而是返回字符串,则将该字符串视为可迭代,其中字符串中的每个元素都是单个字符串。这导致在每个字符之后进行刷新,这将比没有连接字符串更糟糕。

不要发送内容长度并在派生时发送输出。 如果你不这样做,你不需要知道输出的大小 发送Content-Length标头。这种方式可以发送部分响应 在计算其余部分之前。

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/html')]
    start_response(status, response_headers)

    yield head()
    yield part1()
    yield part2()
    yield part3()
    yield "<!-- bye now! -->"

否则你不会从发送块中获益, 因为计算输出可能是缓慢的部分 无论如何,互联网协议将以块的形式发送输出。

可悲的是,这在例如计算的情况下不起作用 of part2()决定你真的需要更改标题(如cookie) 或者需要构建其他页面全局数据结构 - 如果发生这种情况,您需要先计算整个输出 发送标题,也可以使用 return [output]

例如 http://aaron.oirt.rutgers.edu/myapp/文档/ W1200_1200.config_template 需要为子部分的链接构建页面全局数据结构 显示在页面顶部 - 所以必须呈现最后一个子部分 在第一个输出块传递给客户端之前。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top