【问题标题】:Iterating the streaming_content attribute on django FileResponse迭代 django FileResponse 上的 streaming_content 属性
【发布时间】:2015-04-24 19:22:53
【问题描述】:

我正在使用 django rest 框架开发一个 api,并且我正在编写一些单元测试来检查关键操作。我正在尝试在执行 get 请求后读取文件的内容

downloaded_file = self.client.get(textfile)

问题是返回的对象是类型:django.http.response.FileResponse,它继承自StreamingHttpResponse

我正在尝试迭代 streaming_content 属性,它应该是一个迭代器,但我无法迭代,没有方法 next()

我检查了这个对象,我得到的是地图对象。关于如何从此请求中获取内容的任何想法?

编辑:

问题解决

返回的对象是一个map,一个map接受一个函数和一个iterable:

https://docs.python.org/3.4/library/functions.html#map

我要做的就是将地图转换为列表,访问列表的第一个元素并将字节转换为字符串。不是很优雅,但很有效。

list(response.streaming_content)[0].decode("utf-8")

【问题讨论】:

  • 对于 python 2.7 和 django 1.8 以上只返回第一行。但这将返回所有内容: "".join([x for x in response.streaming_content])
  • 这个是相关的吗? stackoverflow.com/questions/35647476/…
  • 确实,建议的解决方案“不是很优雅”:)。无需投到list(见我的回答)。

标签: python django django-rest-framework


【解决方案1】:

这是从streaming_content 地图中提取内容的方法:

content = downloaded_file.getvalue()

查看getvalue()方法的代码,我们看到它只是对答案内容进行了迭代:

class StreamingHttpResponse(HttpResponseBase):
    ...
    def getvalue(self):
        return b''.join(self.streaming_content)

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多