如何在django rest框架的分页URL中的下一关键字中更改主机?

问题描述 投票:0回答:1

我在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中的反向代理进行设置。

django docker nginx django-rest-framework gunicorn
1个回答
1
投票

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方法以提供所需的主机/域名

© www.soinside.com 2019 - 2024. All rights reserved.