Sanic:request.ip 和 request.remote_addr 的区别?

Sanic: difference between request.ip and request.remote_addr?

ip和Sanic请求的remote_addr属性有什么区别?

Sanic framework的源代码:

@property
def ip(self):
    """
    :return: peer ip of the socket
    """
    if not hasattr(self, "_socket"):
        self._get_address()
    return self._ip


@property
def remote_addr(self):
    """Attempt to return the original client ip based on `forwarded`,
    `x-forwarded-for` or `x-real-ip`. If HTTP headers are unavailable or
    untrusted, returns an empty string.

    :return: original client ip.
    """
    if not hasattr(self, "_remote_addr"):
        self._remote_addr = self.forwarded.get("for", "")
    return self._remote_addr

一些代理或负载平衡器可以隐藏原始客户端 ip。提到的 headers 可以存储这个值。

例如,请参阅 X-Forwarded-For header

的文档

request.ip只显示直接连接Sanic的地址,而request.remote_addr只显示代理给的远程地址(例如,如果你是running behind Nginx)。您需要根据您的应用程序是否 运行 在代理后面进行选择。要同时支持两者,请使用

user_ip = request.remote_addr or request.ip