Ian*_*Ian 4 python mod-wsgi yield
现在我有一个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]
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人知道一种方法来改变它以在yield基础上运行而不是return,这样我可以在生成页面时发送它,而不仅仅是在它完成后,因此页面加载对于用户来说可以更快.
但是,每当我将输出交换为列表并在application()中生成它时,它都会抛出一个错误:
TypeError: sequence of string values expected, value of type list found
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
"但是,每当我将输出交换为列表并在应用程序()中生成它时,它都会抛出错误:"
好吧,不要列出清单.产生每个元素:
for part in mylist:
yield part
Run Code Online (Sandbox Code Playgroud)
或者如果列表是整个内容,只需:
return mylist
Run Code Online (Sandbox Code Playgroud)
因为列表已经是迭代器并且可以单独生成.
请注意,除非绝对必要,否则应避免"收益率".特别是如果产生许多小字符串,"收益率"将是低效的.这是因为WSGI规范要求在每个字符串产生之后必须刷新响应.对于Apache/mod_wsgi,刷新意味着每个字符串通过Apache输出桶队列和过滤器系统被强制输出到套接字上.忽略Apache输出过滤器系统的开销,将大量小字符串写入套接字只是开始时很糟糕.
从应用程序返回字符串数组时也存在此问题,因为还必须在数组中的每个字符串之间执行flush.这是因为字符串被处理为可迭代而不是列表.因此,对于预先形成的字符串列表,将单个字符串连接成一个大字符串并返回仅包含该字符串的列表要好得多.这样做还允许WSGI实现自动生成响应的Content-Length(如果未明确提供).
只需确保将列表中的所有字符串连接成一个,结果将在列表中返回.如果没有这样做,而是返回字符串,则将该字符串视为可迭代,其中字符串中的每个元素都是单个字符串.这导致在每个字符之后进行刷新,这将比没有连接字符串更糟糕.
| 归档时间: |
|
| 查看次数: |
3259 次 |
| 最近记录: |