Flask 是一個 Python 實現的 Web 開發微框架。這篇文章是一個講述如何用它實現傳送視頻數據流的詳細教程。
我敢肯定,現在你已經知道我在O'Reilly Media上發布了有關Flask的一本書和一些視頻資料。在這些上面,Flask框架介紹的覆蓋面是相當完整的,出于某種原因,也有一小部分的功能沒有太多的提到,因此我認為在這里寫一篇介紹它們的文章是一個好主意。
這篇文章是專門介紹流媒體的,這個有趣的功能讓Flask應用擁有這樣一種能力,以分割成小數據塊的方式,高效地為大型請求提供數據,這可能要花費較長的時間。為了說明這個主題,我將告訴你如何構建一個實時視頻流媒體服務器!
什么是流媒體?
流媒體是一種技術,其中,服務器以數據塊的形式響應請求。我能想到一個原因來解釋為什么這個技術可能是有用的:
非常大的響應 。對于非常大的響應而言,內存中收集的響應只返回給客戶端,這是很低效的。另一種方法是將響應寫入磁盤,然后使用flask.send_file()返回文件,但是這增加了I/O的組合。假設數據可以分塊生成,以小塊數據的方式給請求提供響應是一種更好的解決方案。
實時數據 。對于一些應用,需要請求返回的數據來自實時數據源。在這個方面一個非常好的例子就是提供一個實時視頻或音頻。很多安全攝像機使用這種技術將視頻數據流傳輸給Web瀏覽器。
使用Flask實現流式傳輸
Flask通過使用生成器函數對流式響應提供本機支持。生成器是一個特別的函數,它可以中斷和恢復。考慮一下下面的函數:
def gen(): yield 1 yield 2 yield 3
這是一個運行三步的函數,其中每步返回一個值。描述生成器如何實現超出了本文的范圍,但如果你有點好奇,下面的shell會話將給你說明生成器是如何被使用的:
>>> x = gen()>>> x<generator object gen at 0x7f06f3059c30>>>> x.next()1>>> x.next()2>>> x.next()3>>> x.next()Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration
在這個簡單的例子中你能看到,一個生成器函數可以順序得返回多個結果。Flask使用生成器 函數這一特性來實現流式傳輸。
下面的例子說明了如何使用流式傳輸能夠產生大的數據表,而不必將整個表放入內存中:
from flask import Response, render_templatefrom app.models import Stock def generate_stock_table(): yield render_template('stock_header.html') for stock in Stock.query.all(): yield render_template('stock_row.html', stock=stock) yield render_template('stock_footer.html') @app.route('/stock-table')def stock_table(): return Response(generate_stock_table())
新聞熱點
疑難解答