一、视频流中间件 (VideoStreamMiddleware)
(一)功能点
- 路径检查与拦截:
- 拦截以
/media/videos/开头的请求路径,对视频文件进行处理。
- 拦截以
- 视频流式传输:
- 支持分片传输视频文件(基于
Range请求头)。 - 默认分片大小为 8MB,可根据实际需求调整。
- 支持分片传输视频文件(基于
- 文件不存在处理:
- 如果目标文件不存在,抛出
Http404。
- 如果目标文件不存在,抛出
- 支持全文件或部分文件传输:
- 根据
Range请求头返回部分文件。 - 如果无
Range请求头,则返回整个文件。
- 根据
- 响应头设置:
- 添加
Content-Range、Accept-Ranges和Content-Length等 HTTP 头,确保流媒体播放兼容性。
- 添加
(二)知识点
-
文件流传输:
- 使用
StreamingHttpResponse按需分块传输文件,减少内存占用,提升大文件处理能力。 - 文件按块读取 (
chunk_size),适合大文件流式传输。
- 使用
-
HTTP Range 请求:
- 客户端可通过
Range请求头指定所需文件的字节范围。 Content-Range响应头返回指定范围的数据,支持断点续传功能。- 格式:
bytes=<start>-<end>,例如bytes=0-1023请求前 1024 字节数据。
- 客户端可通过
-
MIME 类型:
- 使用
mimetypes.guess_type根据文件扩展名推测 MIME 类型,确保浏览器正确识别文件类型。
- 使用
-
路径与文件操作:
- 使用
os.path.join构建文件路径。 - 使用
os.path.exists检查文件是否存在,避免潜在错误。
- 使用
-
文件读取与偏移:
- 使用
f.seek(offset, os.SEEK_SET)设置文件读取起始位置。 - 按需控制读取长度,避免一次性加载整个文件。
- 使用
-
中间件机制:
- 中间件是 Django 处理请求和响应的钩子,
__call__方法定义请求处理逻辑。
- 中间件是 Django 处理请求和响应的钩子,
二、源码
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

最低0.47元/天 解锁文章
1156

被折叠的 条评论
为什么被折叠?



