EMP*_*EMP 7 python pylons http
我有一个Pylons控制器动作,需要将文件返回给客户端.(该文件位于Web根目录之外,因此我不能直接链接到它.)最简单的方法当然是:
with open(filepath, 'rb') as f:
response.write(f.read())
Run Code Online (Sandbox Code Playgroud)
这可行,但对于大文件来说效率显然不高.最好的方法是什么?我无法在Pylons中找到任何方便的方法来流式传输文件的内容.我是否真的必须从头开始编写代码来一次读取一个块?
正确使用的工具是shutil.copyfileobj,它一次从一个块复制到另一个块.
用法示例:
import shutil
with open(filepath, 'r') as f:
shutil.copyfileobj(f, response)
Run Code Online (Sandbox Code Playgroud)
这不会导致非常大的内存使用量,也不需要自己实现代码.
应该采用常见的例外处理 - 如果处理信号(例如SIGCHLD),则必须处理EINTR,因为对响应的写入可能会中断,并且在执行I/O时可能由于各种原因而发生IOError/OSError.
FileApp感谢Chris AtLee和THC4k(来自这个答案),我终于让它上班了.这个方法还允许我设置Content-Length标头,Pylons有很多麻烦,这使浏览器能够显示剩余时间的估计.
这是完整的代码:
def _send_file_response(self, filepath):
user_filename = '_'.join(filepath.split('/')[-2:])
file_size = os.path.getsize(filepath)
headers = [('Content-Disposition', 'attachment; filename=\"' + user_filename + '\"'),
('Content-Type', 'text/plain'),
('Content-Length', str(file_size))]
from paste.fileapp import FileApp
fapp = FileApp(filepath, headers=headers)
return fapp(request.environ, self.start_response)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6227 次 |
| 最近记录: |