尝试提供文件时发生IOerror错误
问题描述:
我正在尝试使用web.py框架将已处理数据的文件返回给webapp用户。在这个例子中,该文件被命名为plate3_v4.gb。我试图用名称results.gb返回它。这是基于this thread。尝试提供文件时发生IOerror错误
下面的代码:
class ServeHandler():
def GET(self):
web.header("Content-Disposition", "attachment; filename=%s" %"results.gb")
web.header("Content-Type", "gb")
web.header('Transfer-Encoding','chunked')
f = open('/usr/local/www/wsgi-scripts/uploads/plate3_v4.gb','rb')
while 1:
buf = f.read(1024 * 8)
if not buf:
break
yield buf
当我去,我认为应该在数据服务给我的页面我得到
mod_wsgi (pid=21773): Exception occurred processing WSGI script '/usr/local/www/wsgi-scripts/code.py'.
IOError: failed to write data
在我的错误日志。
有什么想法?
答
首先,WSGI应用程序不应该设置Transfer-Encoding响应头本身。只有底层的Web服务器应该这样做。对于mod_wsgi,只要没有提供响应内容长度,Apache应该自动执行该操作。
至于错误,它表示客户端在读取所有返回的数据之前关闭了套接字连接。
感谢有关Transfer Encoding的信息,但真的有必要不要设置它?如果web.py应用程序作为独立应用程序和mod_wsgi应用程序使用会怎样? (我只是想知道,因为这个问题是基于我在webpy组发布的代码) – 2012-08-09 06:19:44
这不是您的WSGI应用程序,它以所需格式格式化响应内容。如果你这样做,你违反了WSGI规范,那么底层服务器领域就会担心这一点。 http://www.python.org/dev/peps/pep-0333/#other-http-features – 2012-08-09 08:33:57
谢谢,那么这个食谱条目http://webpy.org/cookbook/streaming_large_files也是不正确的,因为它告诉设置分块标题。 – 2012-08-09 09:54:57