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