【问题标题】:Django-storages S3Boto3Storage makes HEAD and GET requests on readDjango-storages S3Boto3Storage 在读取时发出 HEAD 和 GET 请求
【发布时间】:2018-05-20 08:16:14
【问题描述】:

我在我的 Django 应用程序中使用来自django-storages 包的S3Boto3Storage 存储后端。我使用后端来处理 S3 中的大量文件。

从存储中读取文件时,后端会分别发出HEADGET 请求。我多次执行此操作,因此如果可能,我希望跳过HEAD 请求。

我的读取操作如下所示:

class MyModel(models.Model):
    img = FileField()

instance = MyModel.objects.filter().first()
instance.img.read()

我使用默认的preload_metadata 标志,即False

是否有其他设置可以控制读取方法的这种行为?

我的猜测是HEAD 请求在获取文件内容之前检查文件是否存在。所以也许HEAD 调用可以替换为try/except 语句。但我不知道该怎么做。

【问题讨论】:

    标签: python django amazon-s3 boto3 python-django-storages


    【解决方案1】:

    注意以下解决方案不适用于生产,如果在您的代码中看到此问题,您的领导会惩罚您 :)

    我的包版本是旧的:
    django-storages==1.1.8
    boto==2.38.0
    boto3==1.2.1
    但主要思想(我希望)会被理解

    在您的应用程序的某个“开始”级别(根据您的喜好)放置以下补丁(或者,如果您愿意,可以扩展类)。

    from storages.backends import s3boto
    
    
    def monkey_init(self, name, mode, storage, buffer_size=None):
        """Only 'validate=mode != "rb"' was added in 'get_key' method's call"""
        self._storage = storage
        self.name = name[len(self._storage.location):].lstrip('/')
        self._mode = mode
        self.key = storage.bucket.get_key(self._storage._encode_name(name),
                                          validate=mode != "rb")
        if not self.key and 'w' in mode:
            self.key = storage.bucket.new_key(storage._encode_name(name))
        self._is_dirty = False
        self._file = None
        self._multipart = None
        # for files larger than this.
        if buffer_size is not None:
            self.buffer_size = buffer_size
        self._write_counter = 0
    
    
    s3boto.S3BotoStorageFile.__init__ = monkey_init
    

    在我的django-storages 版本中,方法get_key 的调用不会将validate 变量传递给它。除了明确重新定义__init__ 方法外,我没有找到任何强制/更改它的方法。

    PS:如果您的设置在日志记录中不包含明确的boto 部分 -> GET/HEAD/etc 将不会显示日志。博托的要求。只需将boto 部分添加到日志记录设置部分即可。

    'boto': {
        'handlers': LOGGING_HANDLERS,
        'level': 'DEBUG',
        'propagate': False,
    },
    

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      相关资源
      最近更新 更多