【问题标题】:Django | Serve two uploaded images version - WebP and JPEG姜戈 |提供两个上传的图像版本 - WebP 和 JPEG
【发布时间】:2021-03-22 06:13:40
【问题描述】:

我只想问你一个最佳实践,如何通过 Django 向用户提供 WebP 和 JPEG 图像。

我有一个关于车辆的网站 - 每天大约增加 1000 辆汽车,每辆车大约有 10 张图片。那是很多图像。我制作了一个自定义的“import django-admin 命令”,它解析车辆:

  1. 它从源下载 JPEG 图像(单个车辆 10 张图像)
  2. 然后为所有下载的图像应用水印
  3. 之后,此图像被转换为​​ WebP 格式并通过 Django save() 上传到具有车辆 ForeignKey 的 Images 表(我为此使用 ImageField)
  4. 然后它压缩原始 JPEG 图像,并通过 shutil.move 将这些压缩的 JPEG 图像移动到存储 WebP 图像格式的同一文件夹中。

因为我使用的是 AMP HTML,所以对于不支持 WebP 的浏览器,我可以简单地从 WebP 回退到 JPEG。而且由于图像位于同一个 /media/.../ 文件夹中,因此可以完美运行。

但今天我发现,这种方法并不完美。当图像名称相同时,Django 在 save() 方法中的 get_random_string() 方法,在文件末尾生成额外的 7 个字符https://github.com/django/django/blob/master/django/utils/crypto.py

所以我的 shuitl.move() 方法失败了:

shutil.Error: Destination path '/home/django/exampleproject/media/2020/12/10/example-compressed-image-img01.jpg' already exists

而且我不知道,如何弄清楚,如何为这个 JPEG 文件获得相同的名称 - 如何在文件末尾获得这个哈希值。文件名必须相同 - 对于 WebP 和 JPEG,唯一的扩展名必须不同。 当然,我可以列出所有文件,找到那些哈希并尝试附加它们……但我认为,这种方法并不完美。

最好的方法是仅使用 WebP 图像,但并非所有浏览器都支持它。由于 SEO,使用 WebP 对我来说非常重要 - 它在文件名中有关键字。

有没有更好的方法,如何将 ImageField 中的 WebP 和 JPEG 图像保存到同一个 upload_to 目录,同名(当文件名已经存在时,Django 也会重命名它)?我不想为那个或两列使用两个表,因为它是很多字符串,如果我将来有 10M+ 记录,那么数据库中的数据就会很多。

如果有任何建议,我会很高兴,谢谢!

【问题讨论】:

    标签: django jpeg amp-html webp


    【解决方案1】:

    我通过在文件名中插入 uuid 解决了类似的问题。这是一个例子。 Enforce unique upload file names using django?

    另一种选择是上传到 S3,它将根据需要自动创建唯一的文件名,然后针对新上传的文件运行 lambda 函数以生成第二个图像和文件名。

    【讨论】:

    • 感谢您的建议。也许我会使用这个uuid 解决方案。对于 S3,这将是最好的解决方案,但它确实很昂贵 - 因为我每天将拥有大约 3-5 GB 的图像。
    猜你喜欢
    • 2012-08-19
    • 2016-09-22
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2021-05-08
    • 2012-11-19
    相关资源
    最近更新 更多