动态创建图像缩略图(使用django)

时间:2010-01-21 02:26:15

标签: python django thumbnails

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

对此明显的解决方案是使用django视图执行以下操作:

  1. 以此大小查找以前缓存的图像版本。
  2. 如果没有缓存,则创建一个缩略图(一些锁定逻辑,这样只有一个进程创建缩略图,其他进程等待)。
  3. 通过django传输结果。
  4. 那应该“有效”,但我关心的是表现。我不喜欢使用django来提供静态内容的想法。有什么其他方法可以解决这个问题?

10 个答案:

答案 0 :(得分:8)

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

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

修改

对于实际的网址结构,我觉得更典型的/images/filename-120x45.jpg可以让您更轻松地过滤掉与动态缩略图生成无关的404请求。比如说,/images/original_size_image.jpg有大量的404错误。你不希望那些被路由到Django,你只能匹配该格式的文件名与正则表达式。 [结束编辑]

你必须小心,但让任何人都知道这个功能垃圾邮件你的Django应用程序。他们可以通过触手可及的无限数量的图像大小和文件名组合来杀死它。您需要确定如何对这些请求设置上限,例如,如果任一维度大于原始维度,则重定向回404,或者甚至计算如何限制同一图像的多个维度的请求。也许这就是你在提到“锁定”时所得到的。

顺便说一句,我看到你标记了Apache,但我真的很想建议你通过类似Nginx的东西来提供静态内容。如果您使用的静态文件服务器在提供静态文件时不是完全废话,您可以否定动态图像请求的额外开销。

答案 1 :(得分:5)

您也可以尝试sorlSatchmo正在使用它。

答案 2 :(得分:4)

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

使用tornadoweb服务器在Python中开发。

https://github.com/globocom/thumbor

pip install thumbor

伟大的应用

答案 3 :(得分:2)

答案 4 :(得分:2)

您可以查看the sorl-thumbnail documentation。我在几乎所有项目中都使用它,并使用来自/media/目录的Nginx提供静态内容:)

答案 5 :(得分:2)

我查看了这些答案,即使它们有效,但它们对我来说太软了。 如果您只想快速而肮脏地获取缩略图,那么只需使用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库here

干杯,希望这有助于某人。

答案 6 :(得分:0)

查看此讨论页面,了解Django的缩略图贡献:

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

Thumbor确实是一项很棒的服务,你可以在django上使用django-thumbor。

pip install django-thumbor

回复: https://github.com/ricobl/django-thumbor

答案 9 :(得分:0)

您可能只需要根据需要根据所需的指定尺寸调整显示图像的大小。 Django Imagefit库就是这样做的,它也提供了裁剪的可能性。

在你的例子中,你会写{{ 'http://example.com/images/1234.jpg'|resize:'120x45' }},你会以120x45大小的图像结束。