我想根据URL中的参数动态创建缩略图。例如, http://mysite.com/images/1234/120x45.jpg 会创建一个 120x45 图像ID的缩略图 1234.

明显的解决方案是具有Django视图,该视图可以执行以下操作:

  1. 在此尺寸下查找图像的先前缓存版本。
  2. 如果没有缓存,则创建一个缩略图(一些用于锁定的逻辑,以便只有1个进程创建缩略图和其他进程等待)。
  3. 通过Django将结果管输送。

那应该“工作”,但我担心性能。我不喜欢使用Django提供静态内容的想法。解决这个问题的其他方法还有哪些方法?

有帮助吗?

解决方案

您不必使用Django直接提供静态内容。只需将您的服务器路由404请求您的Images文件夹到Django视图,然后将文件名分开并生成适当的缩略图,然后再将其重定向到原始URL(希望它将不再是404)。

至于另一个答案的django-imagekit建议,我不确定它是否可以让您 动态 基于URL生成图像拇指,但我当然建议将其用于所有功能。

编辑:

至于实际的URL结构,我感到更典型 /images/filename-120x45.jpg 将使您更轻松地滤除与动态缩略图生成无关的404个请求。例如,说有很多404个错误 /images/original_size_image.jpg. 。您不希望那些被路由到Django的人,并且只能将该格式的文件名与Regex匹配。 结束编辑

您必须小心,让任何人都知道此功能垃圾邮件您的Django应用程序。他们可能会以无限数量的图像大小和触手可及的文件名组合杀死它。您将需要弄清楚如何在这些请求上放大上限,例如,如果任何一个维度都比原始尺寸大,甚至弄清楚如何限制了如何对同一图像的多个维度限定请求。也许这就是您在提到“锁定”时所得到的。

顺便说一句,我看到您已经标记为Apache,但我真的想建议您通过类似的内容提供静态内容 nginx. 。如果您使用在服务静态文件时不完全废话的静态文件服务器,则可能会否定动态图像请求的额外开销。

其他提示

你也可以尝试 Sorl, ,正在使用 satchmo.

请参阅此应用程序以产生大拇指。

使用Tornadoweb服务器在Python开发。

https://github.com/globocom/thumbor

pip install thumbor

出色的应用

我查找了这些答案,即使它们工作的工作对我来说太高了。如果您只想快速而肮脏的方法来获取缩略图,则仅使用PIL库可能是一个很好的电话,这是我的代码:

file, ext = os.path.splitext('image.jpg')
im = Image.open('/full/path/to/image.jpg')
im.thumbnail(size, Image.ANTIALIAS)
thumb_path = os.path.join('/full/path/to/thumb/dir/', file + ".thumb" + ".jpeg")
im.save(thumb_path)

下载PIL图书馆 这里

欢呼,希望这对某人有帮助。

你可以窥视 Sorl-Thumbnail文档. 。我在我的几乎所有项目中都使用它,以及从 /media/ dir :)

查看此讨论页面有关Django的缩略图贡献:

https://code.djangoproject.com/wiki/thumbnails

我遇到了同样的问题:在高流量站点中,在响应时间生成数十个缩略图是不可行的,就像生成批处理所有过去内容的缩略图一样,因此我为此创建了一个应用程序。一探究竟: https://github.com/hcarvalhoalves/django-rest-thumbnails

拇指师确实是一项出色的服务,您可以在Django上使用Django-Thumbor。

pip install django-thumbor

回购在这里:https://github.com/ricobl/django-thumbor

您可能只需根据需要根据所需的指定维度调整显示的图像大小。这 Django ImageFit 图书馆确实做到了这一点,并且还提供了作物的可能性。

在您的示例中,您会写 {{ 'http://example.com/images/1234.jpg'|resize:'120x45' }} 您将以120x45尺寸的图像结束。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top