Django中如何将youtube-dl输出直接返回浏览器无需服务器磁盘存储
实现方案
你可以通过 subprocess.Popen 启动 youtube-dl 子进程捕获标准输出流,再配合 Django 的 StreamingHttpResponse 直接将流返回给客户端,全程不会在服务器磁盘写入任何文件,参考代码如下:
首先导入依赖模块:
from django.http import StreamingHttpResponse import subprocess
编写下载视图逻辑:
def download_twitch_clip(request, pk): # 构造 youtube-dl 执行命令 ydl_cmd = [ "youtube-dl", "-o", "-", # 指定输出到标准输出 "--quiet", # 关闭运行日志输出,避免污染视频流 f"https://clips.twitch.tv/{pk}" ] # 启动子进程,捕获标准输出,忽略错误输出 ydl_process = subprocess.Popen( ydl_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL ) # 构造流式响应,按块读取子进程输出 response = StreamingHttpResponse( iter(lambda: ydl_process.stdout.read(4096), b""), content_type="video/mp4" ) # 配置响应头触发浏览器下载,自定义保存文件名 response["Content-Disposition"] = f"attachment; filename=twitch_clip_{pk}.mp4" return response
注意事项
- 请确保服务器运行环境已安装 youtube-dl,且 Django 进程有对应执行权限
- 若需要指定视频清晰度,可以先调用 youtube-dl 格式查询接口获取对应格式编码,在命令中添加
-f 格式编码参数即可,同时可根据实际格式调整content_type取值 - 应对大文件下载场景时,建议调整服务器反向代理、Django 进程的超时阈值,避免下载中途断连
- 可在响应结束逻辑中添加进程资源回收逻辑,调用
ydl_process.wait()避免产生孤儿进程
内容的提问来源于stack exchange,提问作者Hossein Mirjalali
相关产品推荐
相关产品推荐

