使用亚马逊s3时,Django ImageField网址速度很慢

时间:2015-05-31 09:42:55

标签: python django heroku amazon-s3 boto

在我目前在Heroku上运行的Django应用程序中,我注意到在s3上托管时,从ImageFields中检索URL是永远的。 该应用程序是使用Django Rest Framework编写的。当我尝试检索具有图像字段的对象列表时,响应非常慢Heroku会引发超时错误。我假设这是因为boto必须在每个请求时为每个单独的ImageField从s3检索一个url。 如何加快进程以防止这些超时错误?

3 个答案:

答案 0 :(得分:1)

您可以在模型中创建新字段,例如image_url

class YourModel(...):
    image_url = models.CharField(...)
    # other fields

首次上传/保存图片时,检索其网址并使用此值填充image_url字段。但是,您需要再次保存模型。

您可以在以后需要时使用此值。

<强>记过

这可能会导致不必要的数据库查找。但是,如果您使用Memcached或类似的东西来缓存数据库,我不会担心。

答案 1 :(得分:0)

上述xyers提供了一种解决方案。这是我用于我的项目的其他可能的解决方案。 您可以在django项目的settings.py文件中定义MEDIA_URL变量:

MEDIA_URL = 'https://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME

然后,当您需要访问URL时,可以使用此变量。例如,如果您有型号:

class MyModel(...):
    image = FileField(...)

然后您可以按如下方式获取该文件的URL:

mymodel = MyModel.objects.get(...)
image_url = os.path.join(settings.MEDIA_URL, mymodel.image.name)

答案 2 :(得分:0)

我也遇到过类似的问题,我决定要做的就是更改此问题:

class SomeModelSerilazier(serializers.ModelSerializer):

    png_icon = serializers.SerializerMethodField()
    ...

    def get_png_icon(self, some_model_obj):
        return some_model_obj.png_icon.url

对此:

    def get_png_icon(self, some_model_obj):
        return str(some_model_obj.png_icon)

令人惊讶的是,它在我的机器上的工作速度快了15倍。