python请求返回流式处理的类文件对象

python请求返回流式处理的类文件对象,python,django,python-requests,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'

我创建了一个请求对象,如下所示:

 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>
#views.py
类ArticleDetailView(详细视图):
模型=文章
模板名称='song.html'
def get_对象(自身):
obj=super(ArticleDetailView,self).get\u对象()
#将mp3 url存储在obj.mp3和其他内容中的代码
如果obj.mp3:
obj.mp3=requests.get(obj.mp3,stream=True).content
返回obj
#song.html
请求
返回视为我可以与玩家进行流式处理的正确方式是什么?我知道至少我可以将
obj.mp3
写入一个文件,然后将播放器指向文件位置,但我试图避免将文件写入磁盘

谢谢,

查看有关使用类似文件的对象的详细信息

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

import io
resp = requests.get(url, stream=True)
obj.mp3 = io.BytesIO(resp.content)
resp = requests.get(url, stream=True)
resp.raw # is what you need

Django的职责是生成HTML代码,然后由浏览器进行解释。浏览器是需要流式传输音频的设备。您需要通过Django模板传递mp3 url,这样类似于播放器的播放器就可以在客户端进行流式传输。

有一个属性,它已经是一个类似文件的对象

import io
resp = requests.get(url, stream=True)
obj.mp3 = io.BytesIO(resp.content)
resp = requests.get(url, stream=True)
resp.raw # is what you need

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

经过几个小时的尝试,我倾向于得出结论,这根本不可能:django模板需要一个字符串,特别是对于任何音频播放器,该字符串需要表示URL或指向媒体的路径。但是,您和我的代码都返回一个对象。无论如何,谢谢。请注意,这将不尊重记录的传输编码。因此,根据web服务器的不同,使用
raw
可能是错误的。阅读后,我不确定我上一篇评论中提到的问题是否仍然存在。看起来您可以添加
resp.raw.decode\u content=True
来修复它。