python请求返回类似于文件的流对象

时间:2014-02-11 23:18:18

标签: python django python-requests

我创建了一个这样的请求对象:

 obj.mp3 = requests.get('http://foo.com/bar.mp3', stream=True)

我认为我可以将这个obj.mp3对象提供给任何需要文件或URI的音频播放器,显然这个想法是错误的:没有播放。以下是完整代码:

#views.py

class ArticleDetailView(DetailView):
    model = Article
    template_name = 'song.html'

    def get_object(self):
        obj = super(ArticleDetailView, self).get_object()

        #code to store mp3 url in obj.mp3 and other stuff

        if obj.mp3:
            obj.mp3 = requests.get(obj.mp3, stream=True).content
        return obj

#song.html
<div class="audio">
  <audio src={{ article.mp3 }} type="audio/mpeg"> 
</div>

requests的回报视为可以与玩家联系的正确方法是什么?我知道至少我可以将obj.mp3写入文件,然后将播放器指向文件位置,但我试图避免将文件写入磁盘。

谢谢,

3 个答案:

答案 0 :(得分:12)

有一个属性Response.raw,它已经是一个类似于文件的对象。

resp = requests.get(url, stream=True)
resp.raw # is what you need

使用io.BytesIO(resp.content)是不可取的,因为在幕后您要读取两次相同数量的数据(同样是内存方式):访问resp.content将从网络流中读取所有内容,然后{{1 }}再次分配相同数量的内存,然后从BytesIO对象中读取它。

答案 1 :(得分:9)

查看io module是否使用类似文件的对象。

您可以使用可以使用io.BytesIO初始化的Response.content。然后,您将获得一个类似文件的对象,而不是字节列表。

import io
resp = requests.get(url, stream=True)
obj.mp3 = io.BytesIO(resp.content)

答案 2 :(得分:1)

Django的职责是生成HTML代码,然后由浏览器解释。浏览器需要流式传输音频。您需要通过Django模板传递mp3网址,然后像http://www.jwplayer.com/这样的播放器可以在客户端传输。