【问题标题】:How do I make Flask stream a static file with HTTP 206 Partial Content?如何使 Flask 流成为具有 HTTP 206 部分内容的静态文件?
【发布时间】:2014-07-19 15:20:55
【问题描述】:

我想在一个由 Flask 提供支持的网站上使用循环视频。显然,Chrome 不会循环播放视频 unless it was streamed with an HTTP 206 code being returned。然而,Flask 总是返回这个带有 HTTP 200 的静态文件。如何从我的 Flask 项目(托管在 Heroku 上,为了记录)流式传输静态内容以使视频在 Chrome 中正确循环?

【问题讨论】:

  • 您可能想要a custom buildpack with nginx 或其他一些功能齐全的服务器。也就是说,Werkzeug 确实支持Range,因此可以在 Flask 中实现它。
  • 我最终没有实现下面的答案,我只是将这些静态文件移动到了 CDN。

标签: python google-chrome http flask werkzeug


【解决方案1】:

Flask 中的响应对象有一个可以传递的“status_code”参数。有关更多详细信息,请参阅this documentation,但本质上,您可能希望对 Response 对象进行子类化。

还可以查看make_response() - 它可能会揭示一种更简单的方法,具体取决于您的应用程序结构。

查看streaming pattern 了解更多详细信息,但它是针对生成内容而不是静态内容。

【讨论】:

    【解决方案2】:

    我在提供视频文件时遇到了同样的问题,我通过挖掘Werkzeug 的源代码找到了解决方案。我通过在send_from_directory 函数中添加标志conditional=True 来解决它,如下所示:

    @app.route('/uploads/<filename>')
    def uploaded_file(filename):
        """Endpoint to serve uploaded videos
    
        Use `conditional=True` in order to support range requests necessary for
        seeking videos.
    
        """
        return send_from_directory(app.config['UPLOAD_FOLDER'], filename,
                                   conditional=True)
    

    【讨论】:

    • 这是一个比我原来的答案更好(也更具体)的解决方案。
    • 您是否进行了其他更改以使其正常工作?我仍然收到 200 条回复。
    猜你喜欢
    • 2016-09-17
    • 1970-01-01
    • 2018-09-18
    • 2013-03-11
    • 2021-02-19
    • 2013-03-28
    • 1970-01-01
    • 2013-01-30
    • 2019-09-03
    相关资源
    最近更新 更多