如何使用python bottle框架获取客户端IP地址

use*_*814 6 python bottle

我需要使用python的客户端IP地址.我试过下面的代码,但它不能在服务器上运行:

from socket import gethostname, gethostbyname 
ip = gethostbyname(gethostname()) 
print ip
Run Code Online (Sandbox Code Playgroud)

在服务器上,我每次都得到'127.0.0.1'.有没有办法找到客户端的IP地址?

ron*_*man 12

您获得的是服务器的IP地址,而不是服务器客户端的IP地址.

你想查看请求 REMOTE_ADDR,如下所示:

from bottle import Bottle, request

app = Bottle()

@app.route('/hello')
def hello():
    client_ip = request.environ.get('REMOTE_ADDR')
    return ['Your IP is: {}\n'.format(client_ip)]

app.run(host='0.0.0.0', port=8080)
Run Code Online (Sandbox Code Playgroud)

编辑:有些人观察到,对于他们来说,值REMOTE_ADDR始终是相同的IP地址(通常127.0.0.1).这是因为它们位于代理(或负载均衡器)之后.在这种情况下,客户端的原始IP地址通常存储在标头中HTTP_X_FORWARDED_FOR.以下代码适用于任何一种情况:

@app.route('/hello')
def hello():
    client_ip = request.environ.get('HTTP_X_FORWARDED_FOR') or request.environ.get('REMOTE_ADDR')
    return ['Your IP is: {}\n'.format(client_ip)]
Run Code Online (Sandbox Code Playgroud)


Far*_*eed 6

服务器可能在代理后面.用于代理和转发支持:

request.environ.get('HTTP_X_FORWARDED_FOR') or request.environ.get('REMOTE_ADDR')
Run Code Online (Sandbox Code Playgroud)

  • 究竟。有时,HTTP_X_FORWARDED_FOR为“无”,但对于首先检查代理IP很重要。 (2认同)

小智 2

如果您尝试获取外部 IP,则需要从外部源获取它,即whatismyip.com 或提供 api 的地方。如果这就是您正在寻找的内容,请查看请求模块http://docs.python-requests.org/

  • 我认为你没有理解这个问题。(或者也许我没听懂。:) (4认同)