【Django 中间件】视频流中间件,让视频资源访问可以拖动播放

一、视频流中间件 (VideoStreamMiddleware)

(一)功能点
  1. 路径检查与拦截
    • 拦截以 /media/videos/ 开头的请求路径,对视频文件进行处理。
  2. 视频流式传输
    • 支持分片传输视频文件(基于 Range 请求头)。
    • 默认分片大小为 8MB,可根据实际需求调整。
  3. 文件不存在处理
    • 如果目标文件不存在,抛出 Http404
  4. 支持全文件或部分文件传输
    • 根据 Range 请求头返回部分文件。
    • 如果无 Range 请求头,则返回整个文件。
  5. 响应头设置
    • 添加 Content-RangeAccept-RangesContent-Length 等 HTTP 头,确保流媒体播放兼容性。

(二)知识点
  1. 文件流传输

    • 使用 StreamingHttpResponse 按需分块传输文件,减少内存占用,提升大文件处理能力。
    • 文件按块读取 (chunk_size),适合大文件流式传输。
  2. HTTP Range 请求

    • 客户端可通过 Range 请求头指定所需文件的字节范围。
    • Content-Range 响应头返回指定范围的数据,支持断点续传功能。
    • 格式:bytes=<start>-<end>,例如 bytes=0-1023 请求前 1024 字节数据。
  3. MIME 类型

    • 使用 mimetypes.guess_type 根据文件扩展名推测 MIME 类型,确保浏览器正确识别文件类型。
  4. 路径与文件操作

    • 使用 os.path.join 构建文件路径。
    • 使用 os.path.exists 检查文件是否存在,避免潜在错误。
  5. 文件读取与偏移

    • 使用 f.seek(offset, os.SEEK_SET) 设置文件读取起始位置。
    • 按需控制读取长度,避免一次性加载整个文件。
  6. 中间件机制

    • 中间件是 Django 处理请求和响应的钩子,__call__ 方法定义请求处理逻辑。

二、源码

import os
import re
import mimetypes
from django.conf import settings
from django.http import StreamingHttpResponse, Http404

class VideoStreamMiddleware:
    """视频流中间件"""

    def __init__(self, get_response):
        self.get_response = get_respo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值