gpt4 book ai didi

python - 使用生成器流式传输 WSGI 文件

转载 作者:太空狗 更新时间:2023-10-30 02:22:13 26 4
gpt4 key购买 nike

我有以下代码:

def application(env, start_response):
path = process(env)
fh = open(path,'r')
start_response('200 OK', [('Content-Type','application/octet-stream')])
return fbuffer(fh,10000)


def fbuffer(f, chunk_size):
'''Generator to buffer file chunks'''
while True:
chunk = f.read(chunk_size)
if not chunk: break
yield chunk

我不确定它是否正确,但我在互联网上找到的零星信息让我认为它应该有效。基本上我想以 block 的形式流出一个文件,为此我从我的应用程序函数中传回一个生成器。然而,这只会打印出标题,实际上不会发回任何数据,谁能告诉我这是为什么?

或者,如果这是完全错误的,最好的方法是什么?我无法在内存中缓冲整个文件,因为我要处理的文件可能有 GB 大。

第三个问题:输出完成后关闭文件的最佳方式是什么?在我发布的代码中,无论如何我都看不到实际关闭文件。

(我正在使用 uWSGI 1.2.4 运行 python 3.2.3)

最佳答案

如果不小心,uwsgi 会注意不要让错误泄漏,但是如果你在更严格的实现中运行你的应用程序,比如 python 提供的 wsgiref.simple_server,更容易看出问题。

Serving <function application at 0xb65848> http://0.0.0.0:8000
Traceback (most recent call last):
File "/usr/lib64/python3.2/wsgiref/handlers.py", line 138, in run
self.finish_response()
File "/usr/lib64/python3.2/wsgiref/handlers.py", line 179, in finish_response
self.write(data)
File "/usr/lib64/python3.2/wsgiref/handlers.py", line 264, in write
"write() argument must be a bytes instance"
AssertionError: write() argument must be a bytes instance
localhost.localdomain - - [04/Aug/2012 16:27:08] "GET / HTTP/1.1" 500 59

问题是 wsgi 要求 HTTP 网关传输的数据必须以 bytes 的形式提供,但是当你使用 open(path, 'r') ,python 3方便的将读取的数据转成unicode,python 3中的是str,使用默认编码。

改变

fh = open(path, 'r')

fh = open(path, 'rb')
# ^

修复它。

关于python - 使用生成器流式传输 WSGI 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11811404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com