【问题标题】:ImageField not failing at IOError exceptionImageField 在 IOError 异常中没有失败
【发布时间】:2010-02-12 14:20:09
【问题描述】:

嘿,我有一个模型可以保存 2 张图片

class Picture(models.Model):
    picture = models.ImageField(upload_to=make_filename)
    thumbnail = models.ImageField(upload_to=make_thumb_filename)
    car = models.ForeignKey('Car')
    created_on = models.DateField(auto_now_add=True)
    updated_on = models.DateField(auto_now=True)

    def save(self):
        super(Picture, self).save()
        size = 200, 200
        filename = str(self.thumbnail.path)
        image = Image.open(filename)
        image.thumbnail(size, Image.ANTIALIAS)
        image.save(filename)

如您所见,我已经覆盖了 save() 方法 我认为我有一个简单的尝试,除了块,它检查 IOErrors(如果上传了图像以外的文件,则会引发)

def upload(request):
    car = Car.objects.get(pk=1)
    try:
        picture = Picture(picture=request.FILES['image'], thumbnail=request.FILES['image'], car=car)
        picture.save()
    except IOError:
        return HttpResponseRedirect("/test/")

但是,引发了异常,但文件仍然写入服务器(和 db)

如果引发 IOError,任何想法如何确保文件不会被写入?

编辑

通过编写自定义方法修复

def is_accectable_file(filename):
    extension = filename.split('.')[-1]
    acceptable_filetypes = ['jpeg','jpeg','gif','png']
    if extension in acceptable_filetypes:
        return True
    else:
        return False

然后退出我的模型到

class Picture(models.Model):
    picture = models.ImageField(upload_to=make_filename)
    thumbnail = models.ImageField(upload_to=make_thumb_filename)
    car = models.ForeignKey('Car')
    created_on = models.DateField(auto_now_add=True)
    updated_on = models.DateField(auto_now=True)

    def save(self, *args, **kwargs):
        if is_accectable_file(self.picture.name):
            super(Picture, self).save(*args,**kwargs)
            size = 200, 200
            filename = str(self.thumbnail.path)
            image = Image.open(filename)
            image.thumbnail(size, Image.ANTIALIAS)
            image.save(filename)
            return True
        else:
            return False

我的看法

def upload(request):
    car = Car.objects.get(pk=1)
    try:
        picture = Picture(picture=request.FILES['image'], thumbnail=request.FILES['image'], car=car)
        if picture.save():
            return HttpResponse("fine")
        else:
            return HttpResponse("invalid type")
    except:
        return HttpResponse("no file")

【问题讨论】:

    标签: python django ioerror imagefield


    【解决方案1】:

    (我假设)引发 IOError 的代码正在运行您调用super(Picture,self).save() 方法。因此,即使抛出异常,图片也会被写入数据库。

    您只需将super 调用移到设置代码之后。

    顺便说一句,如果您要覆盖 save,我建议您按以下方式进行:

    def save(self,*args,**kwargs):
        ...
        super(Picture, self).save(*args,**kwargs)
    

    否则,在 Django 将参数传递给 save 的任何情况下,您都会遇到异常(我相信在少数情况下会出现这种情况,至少在管理员中是这样)。

    【讨论】:

    • 谢谢。我已经修改了我的代码并在它完成所有图像处理之后添加了超级调用,但是没有上传任何内容,也没有调用异常。
    • 如果是我,接下来我要做的就是在每一行之间添加一个打印语句,这样你就可以确定它正在做你认为它正在做的事情。
    • 我可以在模型中打印吗?
    • 只要你在运行 devserver,是的! (在部署到 prod 之前将它们取出)。
    • 由于自定义方法,它可以正常工作(请参阅原始问题)
    猜你喜欢
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2019-08-16
    • 2017-03-24
    • 2013-10-24
    • 2018-07-07
    • 2016-09-20
    相关资源
    最近更新 更多