【发布时间】:2021-03-22 06:13:40
【问题描述】:
我只想问你一个最佳实践,如何通过 Django 向用户提供 WebP 和 JPEG 图像。
我有一个关于车辆的网站 - 每天大约增加 1000 辆汽车,每辆车大约有 10 张图片。那是很多图像。我制作了一个自定义的“import django-admin 命令”,它解析车辆:
- 它从源下载 JPEG 图像(单个车辆 10 张图像)
- 然后为所有下载的图像应用水印
- 之后,此图像被转换为 WebP 格式并通过 Django save() 上传到具有车辆 ForeignKey 的 Images 表(我为此使用 ImageField)
- 然后它压缩原始 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+ 记录,那么数据库中的数据就会很多。
如果有任何建议,我会很高兴,谢谢!
【问题讨论】: