我在Django Rest Framework中有一个带有分页响应的ModelSerializer。因此,我已将其与gunicorn一起部署在docker容器中。
gunicorn -c gunicorn_config.py app.wsgi --bind 0.0.0.0:5000
现在问题出在分页响应中。 next
键类似于。
next: "http://0.0.0.0:5000/admin/users/?page=2&per_page=10"
在使用这些API的客户端中,我只需检查next
键并获取下一个响应。但是由于next
键将主机作为0.0.0.0:5000
,因此它将导致API调用失败。 next
键不满足此目的。
因此,我的API服务器目前在单独的Docker容器中运行。通过nginx
中的反向代理进行设置。
DRF分页器中的next
链接是使用请求中的主机名生成的。这是在请求中确定主机名的方式:
def _get_raw_host(self):
"""
Return the HTTP host using the environment or request headers. Skip
allowed hosts protection, so may return an insecure host.
"""
# We try three options, in order of decreasing preference.
if settings.USE_X_FORWARDED_HOST and (
'HTTP_X_FORWARDED_HOST' in self.META):
host = self.META['HTTP_X_FORWARDED_HOST']
elif 'HTTP_HOST' in self.META:
host = self.META['HTTP_HOST']
else:
# Reconstruct the host using the algorithm from PEP 333.
host = self.META['SERVER_NAME']
server_port = self.get_port()
if server_port != ('443' if self.is_secure() else '80'):
host = '%s:%s' % (host, server_port)
return host
因此,请检查HTTP_X_FORWARDED_HOST
标头是否设置了所需的正确主机名,如果是,则在设置中将USE_X_FORWARDED_HOST
设置为True
。还要确保将所需的主机名添加到ALLOWED_HOSTS
。
您还可以重写get_next_link()
类中的PageNumberPagination
方法以提供所需的主机/域名