簡體   English   中英

python請求返回類似文件的對象以進行流式傳輸

[英]python requests return file-like object for streaming

我創建了一個這樣的請求對象:

 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寫入文件,然后將播放器指向文件位置,但我試圖避免將文件寫入磁盤。

謝謝,

有一個屬性Response.raw ,它已經是一個類似文件的對象。

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

使用io.BytesIO(resp.content)不是可取的,因為在幕后您兩次讀取相同數量的數據(也是內存方面):訪問resp.content從網絡流中讀取所有內容,然后io.BytesIO(resp.content)再次分配相同數量的內存,然后您從 BytesIO 對象中讀取它。

查看io 模塊以使用類文件對象。

可能您可以使用io.BytesIO ,您可以使用Response.content進行初始化。 然后你得到一個類似文件的對象而不是字節列表。

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

Django 的職責是生成 HTML 代碼,然后由瀏覽器解釋。 瀏覽器需要流式傳輸音頻。 您需要通過 Django 模板傳遞 mp3 url,然后像http://www.jwplayer.com/這樣的播放器可以在客戶端進行流式傳輸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM