gpt4 book ai didi

python - 如何使用 pyramid.response.FileIter

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:52 24 4
gpt4 key购买 nike

我有以下 View 代码试图将 zip 文件“流”到客户端以供下载:

import os
import zipfile
import tempfile
from pyramid.response import FileIter

def zipper(request):
_temp_path = request.registry.settings['_temp']
tmpfile = tempfile.NamedTemporaryFile('w', dir=_temp_path, delete=True)

tmpfile_path = tmpfile.name

## creating zipfile and adding files
z = zipfile.ZipFile(tmpfile_path, "w")
z.write('somefile1.txt')
z.write('somefile2.txt')
z.close()

## renaming the zipfile
new_zip_path = _temp_path + '/somefilegroup.zip'
os.rename(tmpfile_path, new_zip_path)

## re-opening the zipfile with new name
z = zipfile.ZipFile(new_zip_path, 'r')
response = FileIter(z.fp)

return response

但是,这是我在浏览器中得到的响应:

无法将 View 可调用函数 newsite.static.zipper 的返回值转换为响应对象。返回的值为 .

我想我没有正确使用 FileIter。


更新:

自从根据 Michael Merickel 的建议进行更新后,FileIter 函数工作正常。然而,仍然挥之不去的是客户端(浏览器)出现的MIME类型错误:资源解释为文档但使用 MIME 类型应用程序/zip 传输:“http://newsite.local:6543/zipper?data=%7B%22ids%22%3A%5B6%2C7%5D%7D”

为了更好地说明这个问题,我在 Github 上包含了一个很小的 ​​.py.pt 文件: https://github.com/thapar/zipper-fix

最佳答案

FileIter 不是响应对象,就像您的错误消息所说的那样。它是一个可用于响应主体的可迭代对象,仅此而已。 ZipFile 也可以接受文件对象,这在这里比文件路径更有用。让我们尝试写入 tmpfile,然后将该文件指针倒回到开头,并使用它写出而不进行任何花哨的重命名。

import os
import zipfile
import tempfile
from pyramid.response import FileIter

def zipper(request):
_temp_path = request.registry.settings['_temp']
fp = tempfile.NamedTemporaryFile('w+b', dir=_temp_path, delete=True)

## creating zipfile and adding files
z = zipfile.ZipFile(fp, "w")
z.write('somefile1.txt')
z.write('somefile2.txt')
z.close()

# rewind fp back to start of the file
fp.seek(0)

response = request.response
response.content_type = 'application/zip'
response.app_iter = FileIter(fp)
return response

我根据文档将 NamedTemporaryFile 上的模式更改为 'w+b' 以允许将文件写入 读取来自。

关于python - 如何使用 pyramid.response.FileIter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15827090/

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