如何在Eventlet+WSGI+SocketIO中获取客户端WebSocket及页面请求IP?
获取Eventlet+WSGI+SocketIO下的客户端IP
一、获取WebSocket连接的Python客户端IP
在SocketIO的connect事件中,通过WSGI环境变量直接提取客户端IP,这是最可靠的方式:
import socketio import os import eventlet sio = socketio.Server() # 处理WebSocket连接事件 @sio.on('connect') def handle_connect(sid, environ): # 从WSGI环境中获取客户端IP client_ip = environ['REMOTE_ADDR'] print(f"WebSocket客户端IP: {client_ip}") # 静态文件配置 app = socketio.WSGIApp(sio, static_files={ '/': {'content_type': 'text/html', 'filename': '/home/*****/SecChat/index.html'} }) if __name__ == '__main__': eventlet.wsgi.server(eventlet.listen(('', 5000)), app, log=open(os.devnull,"w"))
注:请注意:连接WebSocket的是Python客户端,而非网页端
二、获取网站页面请求的IP
通过自定义WSGI中间件拦截所有静态页面请求,提取IP:
import socketio import os import eventlet sio = socketio.Server() # 处理WebSocket连接事件 @sio.on('connect') def handle_connect(sid, environ): client_ip = environ['REMOTE_ADDR'] print(f"WebSocket客户端IP: {client_ip}") # 自定义中间件捕获页面请求IP def ip_capture_middleware(wsgi_app): def wrapper(environ, start_response): request_ip = environ['REMOTE_ADDR'] print(f"页面请求IP: {request_ip}") return wsgi_app(environ, start_response) return wrapper # 包装WSGI应用,加入中间件 original_app = socketio.WSGIApp(sio, static_files={ '/': {'content_type': 'text/html', 'filename': '/home/*****/SecChat/index.html'} }) app = ip_capture_middleware(original_app) if __name__ == '__main__': eventlet.wsgi.server(eventlet.listen(('', 5000)), app, log=open(os.devnull,"w"))
关键提示
environ['REMOTE_ADDR']是WSGI标准环境变量,Eventlet会自动填充客户端真实IP,适用于WebSocket握手和HTTP页面请求两种场景。- 如果服务部署在反向代理(如Nginx)后,需确保代理传递
X-Forwarded-For请求头,此时从environ['HTTP_X_FORWARDED_FOR']提取真实IP。
内容的提问来源于stack exchange,提问作者Shards-7
相关产品推荐
相关产品推荐

