DRF 将我的 URL 签名从 %2B 转换为 '+
在自描述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
这样可以确保这个字符串在网址中是“安全的”,也就是说它不会包含那些网址不允许的字符。