1

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 を '+' に変換します。

回避策はありますか?

4

1 に答える 1

0

「slugify」で必要な文字列をラップできます: https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.text.slugify

これにより、文字列が常に「URL セーフ」であることが保証されます。

于 2014-07-15T18:47:02.940 に答える