17

我一直在阅读并尝试各种适用于 Django 的缩略图应用程序。这些是要求:

  • 所有生成的缩略图都必须保存在与原始图像分开的 S3 存储桶中,即单独的存储类

  • 删除图像实例时,必须同时删除原始图像文件以及所有生成的缩略图

  • 尽量减少代价高昂的低效率,例如。获取要在 DRF 中序列化的缩略图的 url 不应该在 S3 存储桶中查看它是否每次都存在等。

VersatileImageField 未能满足第一个要求。ImageKit 未能满足第二个要求。第三个要求是我最困惑的地方;我试图让自己了解最佳实践,但信息是零散的,我没有信心根据迄今为止所学的知识做出决定。

根据我的阅读,我的印象是最有效的行为如下:

  • 保存后立即生成缩略图并假设它始终存在
  • 要访问缩略图,请根据原始图像的文件名和缩略图尺寸/质量生成 URL,因为我们知道它肯定存在
  • post_delete 将删除所有缩略图和原始文件

我最感兴趣的是了解 easy-thumbnails 和 sorl-thumbnail 采用的方法的差异(如果它们与我在上面非常简要概述的过程一致,或者如果它们有更有效的方法),以及优点/缺点在他们的每一种方法中。

4

2 回答 2

1

我希望这可以帮助您在模型中,有两个字段 image 和 thumbnail,以便在使用 Pill 生成缩略图之后验证图像类型和大小

from PIL import Image as Img
from io import BytesIO

def create(self,request):
    mutable = request.POST._mutable
    request.POST._mutable = True

    for value in request.FILES.items():
        im = Img.open(value[1])
        im.thumbnail((425, 236), Img.ANTIALIAS)
        buffer = BytesIO()
        im.save(fp=buffer, format='JPEG')

        requset.POST['thumbnail'] = ContentFile(buffer.getvalue(), thumnail_name)

     request.POST._mutable = mutable

要将图像保存在文件夹和缩略图另一个文件夹中,您可以在 ImageField 中使用与 upload_to 不同的路径

于 2021-05-05T03:26:19.560 回答
0

我不确定这是否有帮助,但我过去曾使用过简单的缩略图,而且我相当肯定,如果你稍微配置一下,它就能完成你所要求的所有事情。使用保存功能配置它有点棘手,因为保存功能不需要配置,但这并非不可能。可能导致问题的主要原因是您必须使用“保存并继续编辑”来访问和使用缩略图选项。如果您尚未创建它,因为它是在保存时创建的,除非您这样做,否则它将不可见。

def save()
    found_id = self.id
        super(Team, self).save(*args, **kwargs)
        if self.image and found_id is None and self.original_image_width and self.original_image_height:
            self.image = get_thumbnailer(self.image).get_thumbnail({
                'size': (self.original_image_width, self.original_image_height)
            }).name
        super(Team, self).save(*args, **kwargs)
于 2016-03-04T16:36:25.483 回答