注意:以下解决方案不适用于生产,如果在您的代码中看到此问题,您的领导会惩罚您 :)
我的包版本是旧的:
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,
},