You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django DRF中如何用线程实现视频后台上传至GCP Bucket

实现后台线程上传视频至GCP Bucket

核心思路

先在请求主线程完成序列化器校验(快速返回错误给前端),将视频文件相关数据传给后台线程执行上传操作,主线程直接返回响应,无需等待上传完成。

具体代码实现

import threading
import logging
from django.http import Response
from rest_framework.views import APIView

# 配置日志,用于排查后台上传的异常问题
logger = logging.getLogger(__name__)

def upload_video_to_gcp(validated_data):
    """后台线程执行的上传逻辑"""
    try:
        serializer = VideoSerializer(data=validated_data)
        # 已在主线程校验过合法性,直接执行保存上传
        serializer.save()
        logger.info("视频上传GCP Bucket成功")
    except Exception as e:
        logger.error(f"视频上传GCP Bucket失败: {str(e)}")

class TestsApi(APIView):
    def post(self, request, *args, **kwargs):  
        video_file = request.data.get('video')
        if not video_file:
            return Response({"error": "视频文件不能为空"}, status=400)
        
        # 主线程先完成校验,及时返回错误
        serializervideo = VideoSerializer(data=request.data)
        if not serializervideo.is_valid():
            return Response(serializervideo.errors, status=400)
        
        # 复制校验后的数据,避免请求结束后文件对象失效
        validated_data = serializervideo.validated_data
        # 若视频文件过大,建议先写入临时文件再传递(避免内存占用过高)
        # 示例临时文件处理方式:
        # import tempfile
        # with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        #     for chunk in video_file.chunks():
        #         tmp_file.write(chunk)
        #     validated_data['video'] = open(tmp_file.name, 'rb')
        
        # 创建并启动后台线程
        upload_thread = threading.Thread(
            target=upload_video_to_gcp,
            args=(validated_data,)
        )
        upload_thread.daemon = True  # 守护线程:随主线程退出而终止(可按需调整)
        upload_thread.start()
        
        # 直接返回响应,无需等待上传完成
        return Response({"message": "视频上传任务已启动,后台处理中"}, status=202)

关键注意事项

  • 文件对象生命周期:Django的UploadedFile在请求响应返回后会被自动关闭,大文件场景建议先写入临时文件,再将临时文件传给后台线程,避免读取失败。
  • 异常排查:后台线程的异常不会主动反馈到前端,必须通过日志记录所有异常信息,方便后续排查。
  • 高并发场景优化:简单线程方案仅适合低并发场景,若需高可靠性(如服务器重启不丢失任务、支持任务调度),建议改用Celery+Redis/RabbitMQ这类专业任务队列框架。

内容的提问来源于stack exchange,提问作者Istiyak Shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:47:32