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

8 投票
10 回答
10962 浏览
提问于 2025-04-15 18:17

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

解决这个问题的一个明显方法是使用一个django视图,步骤如下:

  1. 先检查一下是否已经有这个尺寸的图片缓存。
  2. 如果没有缓存,就创建一个缩略图(需要一些逻辑来确保只有一个进程在创建缩略图,其他进程要等着)。
  3. 通过django把结果传递出去。

这样应该是“可行”的,但我对性能有点担心。我不太喜欢用django来提供静态内容。还有什么其他方法可以解决这个问题呢?

10 个回答

4

看看这个应用程序,它可以生成缩略图。

这个应用是用Python开发的,使用了tornadoweb服务器。

https://github.com/globocom/thumbor

pip install thumbor

很棒的应用程序

5

你也可以试试 sorl,这个工具被 Satchmo 使用过。

8

你不一定要用Django来直接提供静态内容。你可以让你的服务器把404请求(也就是找不到的请求)指向你的图片文件夹,然后用Django的一个视图来处理这个请求。在这个视图里,它会把文件名拆分开来,生成合适的缩略图,然后再把用户重定向回原来的网址(希望这样就不会再出现404错误了)。

至于另一个回答提到的django-imagekit,我不太确定它是否能让你根据网址动态生成图片缩略图,但我确实推荐你使用它,因为它有其他很多实用的功能。

编辑:

关于实际的网址结构,我觉得用一个更常见的格式,比如/images/filename-120x45.jpg,可以让你更容易过滤掉那些跟动态缩略图生成无关的404请求。比如说,如果有很多/images/original_size_image.jpg的404错误,你肯定不想把这些请求发给Django处理,而你可以通过正则表达式只匹配这种格式的文件名。[编辑结束]

不过你得小心,不要让任何人知道这个功能,以免他们在你的Django应用上刷屏。他们可能会用无数种图片大小和文件名组合来攻击你的应用。你需要想办法限制这些请求,比如如果请求的尺寸大于原始图片,就重定向回404,或者想办法限制同一张图片的多种尺寸请求。也许你提到的“锁定”就是这个意思。

顺便说一下,我看到你提到了Apache,但我真的想推荐你用像Nginx这样的服务器来提供静态内容。如果你使用一个不那么糟糕的静态文件服务器,可能就能减少动态图片请求带来的额外负担。

撰写回答