私にも起こりました...見つけるのに数時間かかりましたが、最終的にはわかりました。正しい署名が次の場合:
ssCNsAOxLf5vA80ldAI3M0CU2%2Bw=
その場合、AWS は以下を受け入れません。
ssCNsAOxLf5vA80ldAI3M0CU2+w=
唯一の違いは、%2B から '+' への変換です。
S3BotoStorage は実際には正しく生成しますが、エンコーディングは url メソッドの最終行の CachedFilesMixin で行われます ( return unquote(final_url)
)。それを修正するために、新しい CachedFilesMixin を派生させて「損傷」を元に戻しました (この unquote が最初に存在する理由がわからないため、元に戻すと他の問題が発生する可能性があることに言及する必要があります)。
class MyCachedFilesMixin(CachedFilesMixin):
def url(self, *a, **kw):
s = super(MyCachedFilesMixin, self).url(*a, **kw)
if isinstance(s, unicode):
s = s.encode('utf-8', 'ignore')
scheme, netloc, path, qs, anchor = urlparse.urlsplit(s)
path = urllib.quote(path, '/%')
qs = urllib.quote_plus(qs, ':&=')
return urlparse.urlunsplit((scheme, netloc, path, qs, anchor))
ここで見つけたコードを使用した場所。
お役に立てれば...