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

Gat*_*ter 8 python django thumbnails

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

显而易见的解决方案是使用django视图执行以下操作:

  1. 以此大小查找以前缓存的图像版本.
  2. 如果没有缓存,则创建一个缩略图(一些锁定逻辑,这样只有一个进程创建缩略图,其他进程等待).
  3. 通过django管道结果.

这应该"有效",但我关注的是性能.我不喜欢使用django来提供静态内容的想法.有什么其他方法可以解决这个问题?

小智 8

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

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

编辑:

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

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

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


Jos*_*ogi 5

您也可以尝试SORL,它正在使用的Satchmo.