我有一个使用DRF 1.8.x构建的Web服务,主要是模型驱动的。我的目的是在响应中为所有外键字段提供绝对URL,这包括正确的主机名(网关主机名)。但是,由于此api位于nginx网关后面,因此修改了主机名字段,并且向序列化程序实例发送上下文[' request']似乎没有帮助。
到目前为止,我使用装饰器修改主机名并处理自我url字段的基于版本的行为,但是forieign键字段仍然显示为api主机名。以下是我的代码:
serializers.py
class NodeSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.SerializerMethodField()
class Meta:
model = Node
fields = ('url', 'name', 'description', 'owner', 'address',
'created', 'updated', 'endpoint')
extra_kwargs= {
'endpoint': {'view_name': 'loadbalancerendpoint-detail'},
'owner': {'view_name': 'artifactowner-detail'}
}
@set_api_version_ref
def get_url(self, obj):
return self.context['request'].META.get('HTTP_REF')
装饰者 - set_api_version_ref
def set_api_version_ref(f):
@functools.wraps(f)
def wrapper(obj, ref):
base_href = obj.context['request'].META.get('PATH_INFO', None)
http_host = obj.context['request'].META.get('HTTP_X_HOST', None)
'''
Parse the incoming request URL to take API version in to a variable
'''
version_parse = re.search('\/myapi\/v(?P<version>(1(\.[0-1])?))\/\w+', base_href)
api_version = version_parse.group('version')
logger.debug("API Version detected: {}".format(api_version))
href_suffix = base_href+str(ref.id)+"/"
if http_host:
href = 'https://'+http_host+href_suffix
base_path = 'https://'+http_host+'/myapi/'+api_version+"/"
else:
href = href_suffix
base_path = '/myapi/v'+api_version+"/"
logger.debug("href assembled: {}".format(href))
obj.context['request'].META['API_VERSION'] = api_version
obj.context['request'].META['HTTP_REF'] = href
obj.context['request'].META['BASE_PATH'] = base_path
result = f(obj, ref)
return result
return wrapper
将extra_kwargs传递给相关的字段视图名称(loadbalancerendpoint-detail,artifactowner-detail等)似乎为我的pk提供了一个url,但我不知道如何修改其主机名而不使用它一个装饰者的方法,就像我为URL字段做的那样。非常感谢任何帮助,谢谢!