如何在Flask中播放非静态目录下的MP4视频文件
在Flask中播放非静态目录下的MP4视频
要播放Flask默认静态目录外的MP4文件,你需要自定义路由来处理视频文件的请求,同时要支持浏览器的分段加载需求(Range请求),具体实现如下:
1. 后端路由实现
在你的Flask应用中添加以下路由代码,记得替换ALLOWED_VIDEO_DIR为你的视频实际所在目录:
from flask import Flask, request, send_file, abort import os from werkzeug.security import safe_join app = Flask(__name__) # 指定允许访问的视频目录,替换为你的实际路径 ALLOWED_VIDEO_DIR = "/path/to/your/AnyDirectory" @app.route('/video/<filename>') def serve_video(filename): # 安全拼接路径,防止路径遍历攻击 video_path = safe_join(ALLOWED_VIDEO_DIR, filename) # 检查文件是否存在且为MP4格式 if not os.path.exists(video_path) or not filename.endswith('.mp4'): abort(404) # 处理Range请求(支持视频分段加载) range_header = request.headers.get('Range', None) if range_header: file_size = os.path.getsize(video_path) start, end = range_header.strip().split('=')[1].split('-') start = int(start) if start else 0 end = int(end) if end else file_size - 1 chunk_length = end - start + 1 with open(video_path, 'rb') as f: f.seek(start) chunk_data = f.read(chunk_length) response = app.response_class( chunk_data, status=206, mimetype='video/mp4', direct_passthrough=True ) response.headers.add('Content-Range', f'bytes {start}-{end}/{file_size}') response.headers.add('Accept-Ranges', 'bytes') response.headers.add('Content-Length', str(chunk_length)) return response # 非Range请求返回完整视频文件 return send_file(video_path, mimetype='video/mp4')
2. 前端模板调用
在HTML模板中,通过url_for指向自定义的视频路由,而非直接写物理路径:
<video width="800" height="450" controls> <source src="{{ url_for('serve_video', filename='hello.mp4') }}" type="video/mp4"> </video>
关键注意事项
- 安全防护:必须使用
safe_join拼接路径,同时限制允许访问的目录,避免恶意用户通过路径遍历访问服务器上的其他敏感文件。 - 播放兼容性:支持Range请求是大视频正常播放的关键,否则浏览器可能无法加载或播放卡顿。
- 权限控制:如果需要限制视频访问范围,可以在路由中添加身份验证逻辑(比如登录状态检查)。
内容的提问来源于stack exchange,提问作者user3792705
相关产品推荐
相关产品推荐

