如何获取Tornado Web套接字请求的客户端IP?
问题描述:
如何获取Tornado websocket请求的客户端IP?如何获取Tornado Web套接字请求的客户端IP?
我有一个传入连接()s的RequestHandler对象。我怎样才能找到刚刚连线的客户的IP?
def open(self):
ChatSocketHandler.clients.add(self)
i2c.write_byte_data(0x70, 0x00, 0xa5)
IR_on = True
print "Connection initiated"
ChatSocketHandler.send_updates("IR on")
答
像正常RequestHandler
情况下,WebsocketHandler
实例具有一个HTTPServerRequest
对象设置为Handler
的request
属性。您可以使用HTTPServerRequest.remote_ip
属性来获取远程连接的IP。例如:在收到请求时
class EchoWebSocket(websocket.WebSocketHandler):
def initialize(self):
self._closed = False
def open(self):
print(type(self.request))
print(self.request)
print(self.request.remote_ip)
输出:
<class 'tornado.httputil.HTTPServerRequest'>
HTTPServerRequest(protocol='http', host='localhost:8888', method='GET', uri='/ws', version='HTTP/1.1', remote_ip='::1', headers={'Connection': 'Upgrade', 'Upgrade': 'websocket', 'Accept-Encoding': 'gzip', 'Sec-Websocket-Version': '13', 'Host': 'localhost:8888', 'Sec-Websocket-Key': 'oAJpF4f4kp26b2KRjYmRGw=='})
::1
,当我从外部我的网络,即连接的3g它显示我的调制解调器的IP,而不是,我怎么能展现真实始发ip请 – Ossama 2014-10-03 20:41:24
@Ossama在这种情况下,路由器的行为类似于反向代理 - 客户端连接到您的公网IP(这是您的路由器),路由器将请求转发到您的本地IP(“192.168.xx”例)。如果路由器在头文件中没有包含真实客户端IP,那么传递给'tornado',则可能无法获得真实的客户端IP。您可以尝试使用['xheaders'选项](http://www.tornadoweb.org/en/stable/httputil.html?highlight=remote_ip#tornado.httputil.HTTPServerRequest.remote_ip)并查看您的路由器是否包含'X -real-IP' /'X - 转发,For'。 – dano 2014-10-03 22:46:08
我怎么能得到这个?我的头文件如下, – Ossama 2014-10-04 00:14:08