You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:33:28