我将 Autobahn 0.9.2 与 Python 3.4 与 asyncio 一起使用。
问题:使用 WAMP,是否可以从 RPC 端点内部访问充当呼叫者的 IP 和 HTTP 连接标头的对等方?建立连接时是否保留此信息?如果没有,我将如何开始扩展一些工厂来支持这一点?
我的目标很简单:我想要一个 RPC 端点来地理定位连接的对等点(调用者)的 IP,并将增强的数据中继到 Redis。我已经阅读了源代码并且知道信息从哪里通过(autobahn.websocket.protocol.WebSocketServerProtocol -> onConnect(request)),但是我无法从 onJoin 回调中定义的 ApplicationSession 的 RPC 端点向下钻取它。我尝试遍历传输/路由器/路由器会话链并没有设法到达那里。我对初始连接请求中的对等 IP 和 HTTP 标头都感兴趣。
这是蒸馏的组件:
class IncomingComponent(ApplicationSession):
def __init__(self, **params):
super().__init__()
self.redis = StrictRedis(host=config["redis"]["host"], port=config["redis"]["port"], db=config["redis"]["databases"]["ailytics"])
def onConnect(self):
self.join("abc")
@asyncio.coroutine
def onJoin(self, details):
def geolocalize_and_store_event(event, detail):
# Geolocalize here! Have access to caller ID through detail
self.redis.rpush("abc:events", json.dumps(event))
yield from self.register(
geolocalize_and_store_event,
"abc.geolocalize_and_store_event",
options=RegisterOptions(details_arg='detail', discloseCaller = True)
)
以及服务器的初始化:
router_factory = wamp.RouterFactory()
session_factory = wamp.RouterSessionFactory(router_factory)
session_factory.add(IncomingComponent())
transport_factory = websocket.WampWebSocketServerFactory(session_factory, debug=False, debug_wamp=False)
loop = asyncio.get_event_loop()
coro = loop.create_server(transport_factory, '0.0.0.0', 7788)
server = loop.run_until_complete(coro)
try:
loop.run_forever()
except KeyboardInterrupt:
pass
finally:
server.close()
loop.close()