获取Django应用程序的公共地址

时间:2019-03-20 09:53:12

标签: python django nginx

我有一个django应用程序,正在听127.0.0.1,可以通过nginx进行访问。

为了从django应用程序中获取有关公共IP(客户端正在使用的IP)的信息,我有哪些选择?

我目前正在做

def get_local_ip(request):
    """Return the local IP (where the application is listening to)"""
    # TODO: this should be the server IP as seen by the UI (the public IP, where nginx is listening)
    return request.META.get('HTTP_HOST') if request else None

但这将返回127.0.0.1

1 个答案:

答案 0 :(得分:2)

您的nginx配置需要将其添加到标题中,不确定默认情况下是否已完成。 $server_addr是您需要添加到标题中的那个,因此在您的nginx配置中,您需要添加(假设您正在使用反向代理):

proxy_set_header X-Server-IP $server_addr;

然后在您的get_local_ip方法中,您可以通过以下方式访问该标头:

return request.META.get('HTTP_X_SERVER_IP')

请注意,如果您的nginx服务器位于负载均衡器的后面,则该地址仍不会是用户“看到”的地址,因为他们看到了负载均衡器的IP地址。他们看到的地址是:

import socket
ip_address = socket.gethostbyname(request.META.get('SERVER_NAME'))

仅使用DNS解析您的域名(并且可能会减慢您的请求,因为需要进行DNS查找,具体取决于您在DNS记录中设置的TTL)