使用 Amazon s3 时 Django ImageField url 变慢

Django ImageField url slow when using Amazon s3

在我目前 运行 在 Heroku 上的 Django 应用程序中,我注意到在 s3 上托管时,从 ImageFields 检索 url 需要很长时间。 该应用程序是使用 Django Rest Framework 编写的。当我尝试检索具有图像字段的对象列表时,响应非常慢,Heroku 会抛出超时错误。我认为这是因为 boto 必须根据每个请求从 s3 为每个单独的 ImageField 检索一个 url。 我怎样才能加快进程以防止这些超时错误?

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

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

当图像第一次 uploaded/saved 时,检索它的 URL 并使用该值填充 image_url 字段。不过,您需要再次保存您的模型。

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

缺点

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

上面的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)

我遇到过类似的问题,我决定做的是改变这个:

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 倍。