我们图片用的服务器和代码服务器不是同一个,返回给前端的url就需要替换host
1.查看源码里面FileField怎么给服务器返url的,在里面替换host就行
def to_representation(self, value):
if not value:
return None
use_url = getattr(self, 'use_url', api_settings.UPLOADED_FILES_USE_URL)
if use_url:
if not getattr(value, 'url', None):
# If the file has not been saved it may not have a URL.
return None
url = value.url
request = self.context.get('request', None)
if request is not None:
return request.build_absolute_uri(url)
return url
return value.name
2.重写to_representation,替换原先的host
from rest_framework import serializers
class FileField(serializers.FileField):
def to_representation(self, value: Any) -> Any:
if not value:
return None
use_url = getattr(self, 'use_url', api_settings.UPLOADED_FILES_USE_URL)
host = getattr(self, 'host', settings.NEW_FILES_HOST)
if use_url:
if not getattr(value, 'url', None):
# If the file has not been saved it may not have a URL.
return None
url = value.url
request = self.context.get('request', None)
if request is not None:
# 拿到当前的本机ip
original_host = request.get_host()
url = request.build_absolute_uri(url)
if host:
# 替换成新的域名
url = url.replace(original_host, host)
return url
return value.name
网友评论