上传视频遇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实例的逻辑,即使时长验证通过,也不会执行保存操作。
修正步骤
- 移除多余的返回语句:删除
return video_file这一行,让代码能继续执行到创建视频实例的逻辑。 - 正确处理ValidationError:直接抛出
ValidationError会导致服务器500错误,需要捕获异常并返回带错误信息的页面。 - 用上下文管理器优化视频文件操作:使用
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
相关产品推荐
相关产品推荐

