DRF 将我的 URL 签名从 %2B 转换为 '+

1 投票
1 回答
1576 浏览
提问于 2025-04-18 12:14

在自描述API中,DRF在处理超链接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转换成了'+'

我尝试在我的序列化器中解决这个问题:

def transform_image(self, obj, value):
        return urllib.quote(value, safe="%/:=&?~#+!$,;'@()*[]")

但是,无论我怎么做,它总是把%2B转换成'+'。

有没有什么解决办法呢?

1 个回答

0

你可以把任何你想要的字符串放进“slugify”里:https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.text.slugify

这样可以确保这个字符串在网址中是“安全的”,也就是说它不会包含那些网址不允许的字符。

撰写回答