gpt4 book ai didi

python - 使用 Python 请求和响应模拟文件下载

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

我有一些 python 代码可以使用 requests 从 URL 成功下载图像, 并将其保存到 /tmp/ 中。我想测试它是否做了它应该做的。我正在使用 responses测试 JSON 文件的获取,但我不确定如何模拟获取文件的行为。

我假设它类似于模拟标准响应,如下所示,但我想我不知道如何将 body 设置为文件...

@responses.activate
def test_download():
responses.add(responses.GET, 'http://example.org/images/my_image.jpg',
body='', status=200,
content_type='image/jpeg')
#...

更新:根据 Ashafix 的评论,我正在尝试这个(python 3):

from io import BytesIO

@responses.activate
def test_download():
with open('tests/images/tester.jpg', 'rb') as img1:
imgIO = BytesIO(img1.read())

responses.add(responses.GET, 'http://example.org/images/my_image.jpg',
body=imgIO, status=200,
content_type='image/jpeg')
imgIO.seek(0)
#...

但随后,当我正在测试的代码尝试执行我收到的请求时:

a bytes-like object is required, not '_io.BytesIO'

感觉差不多是对的,但是我被难住了。

更新 2:尝试遵循 Steve Jessop 的建议:

@responses.activate
def test_download():
with open('tests/images/tester.jpg', 'rb') as img1:
responses.add(responses.GET, 'http://example.org/images/my_image.jpg',
body=img1.read(), status=200,
content_type='image/jpeg')
#...

但是这次被测试的代码引发了这个问题:

I/O operation on closed file.

当然图像应该仍然在 with block 中打开吗?

更新 3: 我正在测试的代码是这样的:

r = requests.get(url, stream=True)
if r.status_code == 200:
with open('/tmp/temp.jpg', 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)

似乎是最后的 shutil 行正在生成“对已关闭文件的 I/O 操作”。错误。我不太了解这一点 - 文件的流式传输 - 不知道如何最好地模拟这种行为,测试下载的文件是否保存到 /tmp/

最佳答案

您可能需要将 stream=True 传递给 responses.add 调用。像这样的东西:

@responses.activate
def test_download():
with open("tests/images/tester.jpg", "rb") as img1:
responses.add(
responses.GET,
"http://example.org/images/my_image.jpg",
body=img1.read(),
status=200,
content_type="image/jpeg",
stream=True,
)

关于python - 使用 Python 请求和响应模拟文件下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37280960/

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