使用 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 倍。
在我目前 运行 在 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 倍。