如何从WebSocket处理器获取Tornado请求的客户端IP?

2 投票
2 回答
6851 浏览
提问于 2025-04-18 09:54
http://stackoverflow.com/questions/3110919/how-do-i-get-the-client-ip-of-a-tornado-request

上面的链接告诉我们如何获取请求处理程序的客户端IP地址。那么在使用Websocket处理程序时,应该怎么做呢?

谢谢。

2 个回答

4

如果你使用nginx作为代理服务器,情况会稍微复杂一些,这里有两种解决方案:

方案一:使用self.request.remote_ip
如果你坚持使用这个方法,你需要同时配置nginx和你的tornado应用。
第一步:在nginx的服务器配置块中添加以下任意一行:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

或者

proxy_set_header X-Real-Ip $remote_addr;

第二步:在创建tornado的http服务器时,添加xheader选项

server = httpserver.HTTPServer(application, xheaders=True)

这样你就可以使用self.request.remote_ip来获取你的远程IP地址了

方案二:从HttpRequest头中获取X-Real-Ip
下面的代码可以直接给你远程的真实IP:

self.request.headers.get('X-Real-Ip', '')

7

class WebSocketHandler 是从 RequestHandler 这个类继承而来的。

class WebSocketHandler(tornado.web.RequestHandler):

所以,你可以通过这种方式获取到 IP 地址:

class SocketHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        logging.info('Client IP:' + self.request.remote_ip) 

撰写回答