DRF が自己記述型 API でハイパーリンクされた URL をレンダリングする方法にバグがあるようです。DRF は、表示時に S3 (django-storage) の URL 署名を %2B から '+' に変換しています。ただしformat=json
、この翻訳の問題はありません。
例えば:
これはシリアライザーです:
class CatalogueSerializer(serializers.HyperlinkedModelSerializer):
image = HyperlinkedImageField()
class Meta:
model = CatalogueItem
fields = ('url', 'name', 'image')
ハイパーリンクされた画像フィールド:
class HyperlinkedImageField(serializers.ImageField):
def to_native(self, value):
request = self.context.get('request', None)
if value:
url = request.build_absolute_uri(value.url)
else:
url = 'null'
return url
URL の値が正しく、署名が正しい。ただし、DRF が URL をレンダリングすると、これから署名が変更されます....
良い
Signature=lMG4NLl51IHeXWCU%2B2GPBN1vU30%3D&Expires=1404604768
これに:
悪い
Signature=lMG4NLl51IHeXWCU+2GPBN1vU30=&Expires=1404604768
唯一の違いは の翻訳です%2B to '+'
。
シリアライザーで次のことを回避しようとしました。
def transform_image(self, obj, value):
return urllib.quote(value, safe="%/:=&?~#+!$,;'@()*[]")
しかし、それは常に %2B を '+' に変換します。
回避策はありますか?