如何更改 django Rest 框架中分页 URL 中下一个键中的主机?

KdP*_*sda 4 django nginx gunicorn django-rest-framework docker

我在 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

Ken*_*ars 5

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
Run Code Online (Sandbox Code Playgroud)

因此,请检查标头是否HTTP_X_FORWARDED_HOST设置了您需要的正确主机名,如果是,请在您的设置中进行USE_X_FORWARDED_HOST设置True。还要确保您需要的主机名已添加到ALLOWED_HOSTS.

您还可以重写类get_next_link()中的方法PageNumberPagination以提供所需的主机/域名