我们刚刚将一个 Django 项目迁移到 Heroku,并将我们所有的媒体和静态文件放在 Amazon S3 上(使用 django-storages 和 s3-boto)。
尽管我听说过关于 Amazon S3 非常快的一切,并且由于性能缓慢而产生的结果很少,但我们的图像加载速度已经减慢到绝对爬行并且经常超时。超时代码的一个示例是我们的一个模型上的这个属性,它试图选择一个合适的图像,最终退回到返回None
:
@property
def photo(self):
"""Transparently serve the best available image for templates"""
if self.model_shot.storage.exists(self.model_shot.name):
return self.model_shot
elif self.image.storage.exists(self.image.name):
return self.image
else:
return None
当我在导致问题的模型上进行测试时,我尝试了这个:
$ heroku run python manage.py shell
...
>>> design = Design.objects.get(pk=10210)
>>> design.photo
ImageFieldFile
这个命令导致 shell 在最终返回一个对象之前挂起几秒钟。对它的后续调用会立即返回,这让我相信结果被缓存了。
我的问题是,处理这个问题的最佳方法是什么?我听说过很多关于在这种情况下使用 CloudFront 的信息,但这绝对不是因为高流量(我们的网站上应该基本上没有任何流量)。其他一些缓存框架?完全不同的东西?
大多数有问题的图像至少为 1000x1000 像素。