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

上传视频遇AttributeError:TemporaryUploadedFile无get属性求助

问题:上传视频触发AttributeError错误

每次上传视频文件都会出现如下错误:

AttributeError at /CreateVideo 'TemporaryUploadedFile' object has no attribute 'get'

推测问题源于使用moviepy库检查视频时长的逻辑。

提供的代码

视图代码

from moviepy.video.io.VideoFileClip import VideoFileClip
from django.core.exceptions import ValidationError

def create_video(request):
    if request.method == 'POST':
        title = request.POST['title']
        video = request.FILES['video']
        banner = request.FILES['banner']

        video_file = video
        video_clip = VideoFileClip(video_file.temporary_file_path())
        duration = video_clip.duration
        video_clip.close()
        if duration > 600: # 10分钟(秒数)
            raise ValidationError('视频时长不能超过10分钟')
        return video_file

        new_video = Video.objects.create(
            user=request.user,
            title=title,
            video=video,
            banner=banner
        )
        new_video.save()
        return redirect('Video')

    return render(request, 'video/create_video.html')

模型代码

class Video(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,  on_delete=models.CASCADE)
    title = models.CharField(max_length=70)
    video = models.FileField(upload_to='videos')
    created_on = models.DateTimeField(auto_now_add=True)
    banner = models.ImageField(upload_to='banner')
    slug = models.SlugField(max_length=100, unique=True)

问题分析与解决方法

核心问题

视图中的return video_file是错误根源:

  • Django视图必须返回HttpResponse类的实例(比如render、redirect返回的对象),而这里直接返回了TemporaryUploadedFile对象,Django尝试调用它的get方法处理响应,因此触发AttributeError。
  • 这行代码还会打断后续创建Video实例的逻辑,即使时长验证通过,也不会执行保存操作。

修正步骤

  1. 移除多余的返回语句:删除return video_file这一行,让代码能继续执行到创建视频实例的逻辑。
  2. 正确处理ValidationError:直接抛出ValidationError会导致服务器500错误,需要捕获异常并返回带错误信息的页面。
  3. 用上下文管理器优化视频文件操作:使用with语句自动关闭VideoFileClip,避免资源泄漏。

修正后的视图代码

from moviepy.video.io.VideoFileClip import VideoFileClip
from django.contrib import messages

def create_video(request):
    if request.method == 'POST':
        title = request.POST['title']
        video = request.FILES['video']
        banner = request.FILES['banner']

        # 使用上下文管理器自动关闭视频文件
        with VideoFileClip(video.temporary_file_path()) as video_clip:
            duration = video_clip.duration
            if duration > 600:  # 10分钟(秒数)
                messages.error(request, '视频时长不能超过10分钟')
                return render(request, 'video/create_video.html')
        
        # 创建并保存视频实例
        new_video = Video.objects.create(
            user=request.user,
            title=title,
            video=video,
            banner=banner
        )
        return redirect('Video')

    return render(request, 'video/create_video.html')

额外说明

  • 使用messages框架将错误信息传递到前端页面,需要确保模板中渲染了messages内容。
  • Video.objects.create()已经会自动保存实例,无需再调用new_video.save()。

内容的提问来源于stack exchange,提问作者Adamu Abdulkarim Dee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:22:57