我创建了一个这样的请求对象:
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
写入文件,然后将播放器指向文件位置,但我试图避免将文件写入磁盘。
谢谢,
答案 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/这样的播放器可以在客户端传输。