You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Werkzeug实现Django分片音视频流,求优化建议

Django中基于Werkzeug的分片视频流实现优化建议求助

一直以来,我使用RangedFileResponse在Django中实现分片流传输(主要适配Safari浏览器),所用版本是经过深度定制的django-ranged-fileresponse分支版本。

近期在全面使用django-extensions配置开发环境SSL的过程中接触到Werkzeug,发现它可以用来实现分片文件响应。于是我编写了如下代码,测试后发现其速度明显优于原方案,部分场景下提升显著,已确认可作为替代方案:

from werkzeug.http import parse_range_header
from django.http import FileResponse, HttpResponseNotAllowed, HttpResponseBadRequest
import os


def stream_video(request, fqpn, content_type="video/mp4"):

    file_size = os.path.getsize(fqpn)
    if request.method != 'GET':
        return HttpResponseNotAllowed(['GET'])

    if request.is_secure():
        range_header = request.META.get('HTTPS_RANGE')
    else:
        range_header = request.META.get('HTTP_RANGE')

    ranges = parse_range_header(range_header)
    if not ranges:
        return FileResponse(open(fqpn, 'rb'))
    
    # For simplicity, handle only single range requests
    start, end = ranges[0]
    with open(fqpn, 'rb') as file_to_send:
        file_to_send.seek(start)
        data = file_to_send.read(end - start + 1)

    response = FileResponse(data, content_type='application/octet-stream')
    response['Content-Length'] = len(data)
    response['Content-Range'] = f'bytes {start}-{end}/{file_size}'
    response['Accept-Ranges'] = 'bytes'
    response.status_code = 206  # Partial Content
    return response

补充说明

  • 生产环境使用GUnicorn或Hypercorn,开发环境通常使用Django自带服务器或django-extensions的RunServerPlus,两种环境下代码均运行正常。
  • 发现当视频播放器未暂停就关闭时,会触发OSError,需要捕获该异常。

现请教各位,有没有优化这段代码的建议?


内容的提问来源于stack exchange,提问作者Benjamin Schollnick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:52:16