讲师中心 微信公众号
AI工具推荐 视频效率加速

怎样在Python Flask中实现断点续传功能_处理Range请求头

雨墨小哥_6364

雨墨小哥_6364

发布时间:2026-04-30 11:30:26

|

329人浏览过

|

来源于php中文网

原创

Flask需手动解析Range头并返回206响应:提取bytes范围,校验有效性,设置Content-Range;send_file在conditional=True且传入文件对象时可自动支持;大文件应使用流式Response生成器分块读取;反向代理常导致Range失效,需直连排查。

怎样在python flask中实现断点续传功能_处理range请求头

Flask 怎么解析 Range 请求头并返回部分内容

Flask 本身不自动处理 HTTP Range 请求,必须手动读取 Range 请求头、解析字节范围、构造 206 Partial Content 响应。核心是拿到 request.headers.get('Range'),再用正则或字符串切分提取起始和结束位置。

常见错误是直接用 range.split('-') 但没处理末尾无数字的情况(如 bytes=100-),或忽略单位不是 bytes 的非法值。实际只支持 bytes 单位,其他应返回 416 Range Not Satisfiable。

实操建议:

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载
  • 用 re.match(r'bytes=(\d+)-(\d+)?', range_header) 安全提取,捕获组可为空
  • 若结束位置缺失(bytes=100-),需计算文件总大小后补全
  • 起始位置必须 ≥ 0,且不能 ≥ 文件总大小;否则返回 416
  • 响应必须设置 Content-Range 头,格式为 bytes {start}-{end}/{file_size}

如何用 send_file 支持断点续传

send_file 默认不识别 Range,但 Flask 2.2+ 的 send_file 在传入文件对象(而非路径)且设置了 conditional=True 时,会自动启用条件响应逻辑——包括处理 Range 和 If-Range。

立即学习“Python免费学习笔记(深入)”;

注意:这个自动逻辑仅对真实文件路径(pathlib.Path 或 str)无效,必须是打开的二进制文件对象(io.BytesIO 或 open(..., 'rb')),且 conditional=True 是关键开关。

实操建议:

  • 不要传 filename 字符串,改用 open(filepath, 'rb') 得到文件对象
  • 显式加 conditional=True 参数,否则自动 Range 支持不会触发
  • 确保响应中包含 ETag 或 Last-Modified,否则 conditional=True 退化为普通响应
  • 若用 BytesIO,需先调用 .getvalue() 或确保其支持 seek() 和 read()

大文件场景下避免内存爆炸的流式处理方式

用 send_file 加 conditional=True 虽方便,但对超大文件(如 >1GB),Flask 仍可能因内部 seek/read 操作导致 I/O 阻塞或临时缓冲膨胀。更可控的方式是手动流式响应:用 Response + 生成器,按需读取指定范围块,每次只读几 KB。

关键点在于不一次性加载整个范围进内存,而是用 file.seek(start) 定位,循环 file.read(chunk_size) 直到读够 end - start + 1 字节。

实操建议:

  • 用 yield 生成器返回数据块,避免构建大 bytes 对象
  • 设置 Content-Length 为实际返回字节数(即 end - start + 1),别用原始文件大小
  • 务必在响应头中写入 Accept-Ranges: bytes,否则客户端可能不发 Range 请求
  • 对 NFS 或网络存储,频繁 seek 可能变慢,可考虑预读缓存首尾 64KB

前端请求没带 Range 或服务端返回 200 而非 206 怎么排查

最常见原因是 Nginx / Apache 等反向代理默认吞掉 Range 头或强制转成 200。例如 Nginx 默认关闭 underscores_in_headers 不影响,但若配置了 proxy_buffering on,就可能缓存整个响应并丢弃分块语义。

另一个隐蔽问题是 Flask 开发服务器(Werkzeug)在调试模式下不完全兼容部分 Range 边界情况(如 bytes=-100),而生产 WSGI 服务器(Gunicorn/Uvicorn)表现正常。

排查建议:

  • 用 curl -v -H "Range: bytes=0-1023" http://localhost:5000/file 直连 Flask,确认是否返回 206
  • 检查反代配置:Nginx 需开启 proxy_ignore_client_abort off,并确保未设置 proxy_buffering on
  • 用浏览器开发者工具看 Network → Headers,确认请求发出的 Range 和响应的 Status、Content-Range 是否匹配
  • 服务端加日志:打印 request.headers.get('Range') 和最终返回的状态码,定位拦截点

Range 处理真正的复杂点不在 Python 侧,而在中间件、CDN、客户端缓存策略的叠加效应。哪怕代码完全正确,一层 CDN 返回了带 200 的缓存,前端就永远收不到 206。上线前务必绕过所有代理直测,并检查每一层响应头的原始性。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

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

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

1751

2023.07.20

python能做什么
python能做什么

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

4564

2023.07.25

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

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

1729

2023.07.31

python教程
python教程

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

26897

2023.08.03

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

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

3247

2023.08.04

python eval
python eval

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

3267

2023.08.04

scratch和python区别
scratch和python区别

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

1203

2023.08.11

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

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

596

2023.08.10

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn