动态创建图像缩略图(使用Django)
我想根据网址中的参数动态生成缩略图。例如,http://mysite.com/images/1234/120x45.jpg
这个链接会为图片ID 1234
创建一个尺寸为 120x45
的缩略图。
解决这个问题的一个明显方法是使用一个django视图,步骤如下:
- 先检查一下是否已经有这个尺寸的图片缓存。
- 如果没有缓存,就创建一个缩略图(需要一些逻辑来确保只有一个进程在创建缩略图,其他进程要等着)。
- 通过django把结果传递出去。
这样应该是“可行”的,但我对性能有点担心。我不太喜欢用django来提供静态内容。还有什么其他方法可以解决这个问题呢?
10 个回答
看看这个应用程序,它可以生成缩略图。
这个应用是用Python开发的,使用了tornadoweb服务器。
https://github.com/globocom/thumbor
pip install thumbor
很棒的应用程序
你不一定要用Django来直接提供静态内容。你可以让你的服务器把404请求(也就是找不到的请求)指向你的图片文件夹,然后用Django的一个视图来处理这个请求。在这个视图里,它会把文件名拆分开来,生成合适的缩略图,然后再把用户重定向回原来的网址(希望这样就不会再出现404错误了)。
至于另一个回答提到的django-imagekit,我不太确定它是否能让你根据网址动态生成图片缩略图,但我确实推荐你使用它,因为它有其他很多实用的功能。
编辑:
关于实际的网址结构,我觉得用一个更常见的格式,比如/images/filename-120x45.jpg
,可以让你更容易过滤掉那些跟动态缩略图生成无关的404请求。比如说,如果有很多/images/original_size_image.jpg
的404错误,你肯定不想把这些请求发给Django处理,而你可以通过正则表达式只匹配这种格式的文件名。[编辑结束]
不过你得小心,不要让任何人知道这个功能,以免他们在你的Django应用上刷屏。他们可能会用无数种图片大小和文件名组合来攻击你的应用。你需要想办法限制这些请求,比如如果请求的尺寸大于原始图片,就重定向回404,或者想办法限制同一张图片的多种尺寸请求。也许你提到的“锁定”就是这个意思。
顺便说一下,我看到你提到了Apache,但我真的想推荐你用像Nginx这样的服务器来提供静态内容。如果你使用一个不那么糟糕的静态文件服务器,可能就能减少动态图片请求带来的额外负担。