Python Django存储S3boto3存储在读取时发出HEAD和GET请求

Python Django存储S3boto3存储在读取时发出HEAD和GET请求,python,django,amazon-s3,boto3,python-django-storages,Python,Django,Amazon S3,Boto3,Python Django Storages,我正在使用django应用程序中的django storages包中的S3Boto3Storage存储后端。我使用后端处理S3中的大量文件 从存储器读取文件时,后端会发出单独的HEAD和GET请求。我多次执行此操作,因此如果可能的话,我更愿意跳过HEAD请求 我的读取操作与此类似: class MyModel(models.Model): img = FileField() instance = MyModel.objects.filter().first() instance.img

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

从存储器读取文件时,后端会发出单独的
HEAD
GET
请求。我多次执行此操作,因此如果可能的话,我更愿意跳过
HEAD
请求

我的读取操作与此类似:

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

instance = MyModel.objects.filter().first()
instance.img.read()
我使用的是默认的
preload_metadata
标志,即
False

是否有其他设置控制read方法的此行为


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

注意:以下解决方案不适用于生产,如果您的潜在客户在代码中看到此情况,您的潜在客户将对您进行处罚:)

我的软件包版本旧:
django存储==1.1.8
boto==2.38.0
boto3==1.2.1
但(我希望)主要思想会被理解

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

在我的
django storages
版本中,方法
get_key
的调用未将
validate
变量传递到其中。除了显式地重新定义
\uuuu init\uuu
方法外,我没有找到任何强制/更改它的方法

注:如果您的设置没有包含日志->日志中的显式
boto
部分,那么对于boto中的GET/HEAD/etc.requests,将不会显示日志。只需将
boto
部分添加到日志设置部分

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