如何在Python中使用Flask实现支持断点下载的视频点播接口?

星雪吖_1590

星雪吖_1590

2026-10-19

262人浏览

原创

flask需手动解析range头:用request.headers.get("range")提取字符串,正则匹配bytes=start-end格式,支持bytes=start-(至末尾),校验合法性后返回206响应,设置content-range、accept-ranges和content-length,并用二进制文件句柄seek+read分块读取。

如何在python中使用flask实现支持断点下载的视频点播接口?

Flask如何正确解析Range请求头

客户端发起断点续传时,会带 Range: bytes=1024-2047 这样的请求头,Flask 默认不自动解析它——request.headers.get('Range') 返回的是原始字符串,需要手动提取起始和结束字节。直接用 request.range 会报 AttributeError,因为 Flask 的 Request 类默认不启用 range 解析(不像某些 WSGI 中间件或 FastAPI 那样内置支持)。

实操建议:

  • 用正则提取 bytes=(\d+)-(\d+)?,注意结尾可能为空(如 bytes=1024- 表示“从 1024 到末尾”)
  • 必须校验数值合法性:起始不能为负、结束不能小于起始、不能超出文件总大小
  • 若请求头格式错误或缺失,应返回 200 OK 全量响应,而非 416 Range Not Satisfiable ——这是 HTTP/1.1 规范要求

如何构造符合规范的206响应头与分块体

返回 206 Partial Content 不只是改状态码,响应头必须严格匹配 RFC 7233:包括 Content-Range、Accept-Ranges: bytes、Content-Length(是本次返回的字节数,不是整个文件),且 Content-Type 必须与文件实际 MIME 类型一致(如 video/mp4)。

常见错误现象:

  • 漏设 Accept-Ranges → iOS Safari 拒绝断点续传
  • Content-Range 写成 bytes 0-1023/1024(缺等号)→ Chrome 报 ERR_CONTENT_LENGTH_MISMATCH
  • 用 send_file() 直接传 file-like 对象但没指定 as_attachment=False 和 download_name=None → 触发强制下载,破坏流式播放

推荐做法:用 Response 手动构造流式响应,配合 yield 分块读取文件,避免内存加载整段视频。

361SCAN security check your skill python scripts
361SCAN security check your skill python scripts

扫描并分析已安装技能,用于查看指定技能目录的名称、描述和详情,或列出所有已安装的技能。

下载

如何安全读取大视频文件并控制内存占用

视频文件动辄几百 MB,用 open().read() 或 send_file(path, ...) 在无参数控制时会把整个文件读进内存,导致 OOM。必须按需读取字节范围,并限制单次读取大小(如 8KB)。

实操要点:

  • 用 open(path, 'rb') 获取文件句柄,seek(start_byte) 定位,再循环 read(chunk_size)
  • 设置合理 chunk_size(建议 4096–65536):太小增加系统调用开销,太大吃内存
  • 务必在 try/finally 或 with 中关闭文件句柄,否则高并发下 fd 耗尽
  • 若视频存于 NFS 或对象存储(如 S3),不能直接 seek,需换用支持 range 的 client(如 boto3 的 get_object(Range=...))

为什么Nginx反代下Range请求常失效

本地调试时一切正常,部署到生产环境后断点下载失效,大概率是 Nginx 默认透传 Range 头但不透传 Content-Range 和 Accept-Ranges,或者开启了 proxy_buffering on 导致响应被缓存并丢弃部分 header。

关键配置项(加在 location 块内):

  • proxy_pass_request_headers on;(确保 Range 头到达 Flask)
  • proxy_set_header Accept-Ranges bytes;(强制透传)
  • proxy_hide_header Content-Range; → 错!应删掉这行,否则 Nginx 会屏蔽它
  • proxy_buffering off;(避免缓冲破坏流式响应)
  • chunked_transfer_encoding on;(配合 Flask 流式 yield)

最易被忽略的是:Nginx 默认对 206 响应不设置 Content-Range,必须由后端(Flask)完整输出,Nginx 不会帮你补。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1751

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4544

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26797

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3247

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3267

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2523

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习