【问题标题】:How to get client IP address using python bottle framework如何使用 python Bottle 框架获取客户端 IP 地址
【发布时间】:2015-10-03 01:00:49
【问题描述】:

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

from socket import gethostname, gethostbyname 
ip = gethostbyname(gethostname()) 
print ip

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

【问题讨论】:

  • 中间是否有任何服务,例如nginx实际接收来自客户端的外部连接并将html请求转发给bottle?
  • @LukaRahne 当 Apache 将请求转发给瓶子时,我确实遇到了同样的问题:stackoverflow.com/questions/36954669/… 你有什么想法吗?

标签: python bottle


【解决方案1】:

你得到的是你的服务器的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)

编辑#1:有些人观察到,对于他们来说,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)]

编辑 #2:感谢 @ArtOfWarfare 的评论,我了解到每个 PEP-333 不需要 REMOTE_ADDR。几个观察:

REMOTE_ADDR 变量必须设置为向服务器发送请求的客户端的网络地址。

  • 但是,PEP-333 并没有明确要求 HTTP_REMOTE_ADDR,只是到此为止(强调我的):

服务器或网关应该尝试提供尽可能多的其他 CGI 变量。

  • 我熟悉的所有(当然很少)Web 框架集HTTP_REMOTE_ADDR。 AFAICT,这是一个事实上的“标准”。但从技术上讲,YMMV。

【讨论】:

  • 我有同样的问题,REMOTE_ADDR 总是给出 127.0.0.1 :stackoverflow.com/questions/36954669/…
  • 这是如何工作的?谁在设置这个名为REMOTE_ADDR 的变量,它是如何传输的?它是由客户端软件设置的,还是客户端硬件设置的,还是中间的路由器设置的,还是wsgi设置的,还是谁设置的?这个 GET 请求是来自像 Firefox 这样的普通浏览器还是来自 Python requests 脚本,会有什么不同吗? PEP 333 没有提及它,所以我很好奇 REMOTE_ADDR 是在哪里指定/标准化/记录在案的?
  • @ArtOfWarfare 谢谢,我没有意识到这不是标准的。请参阅我的编辑以回应您提出的观点。如果您愿意,很高兴重新编辑以提高清晰度。
【解决方案2】:

服务器可能位于代理之后。将此用于代理和转发支持:

request.environ.get('HTTP_X_FORWARDED_FOR') or request.environ.get('REMOTE_ADDR')

【讨论】:

  • 为什么是or?你能解释一下,它是按位运算符 or 吗?或者只是为了处理 HTTP_X_FORWARDED_FOR 是 None 的情况?
  • 没错。有时,HTTP_X_FORWARDED_FOR 为 None,但首先检查代理 IP 很重要。
【解决方案3】:

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

【讨论】:

  • 我认为您没有理解这个问题。 (或者也许我不明白。:)
  • 你知道吗,我做到了。我看到了他试图使用的代码并得出了结论。好眼力。
猜你喜欢
  • 2012-03-14
  • 2012-02-16
  • 2010-12-11
  • 2016-01-12
  • 2021-07-05
  • 2017-12-20
  • 2019-01-14
  • 2015-02-26
  • 2015-12-20
相关资源
最近更新 更多