<p>功能还没有如@oberstet所说,但是由于使用了工厂模式的高速公路/WAMP工具,我能够在不更改库代码的情况下提出解决方案。在</p>
<p><strong>子类有3个组件:</strong></p>
<p>首先,我们向wamp.RouterSession公司的子类</p>
<pre><code>class IncomingServerSession(wamp.RouterSession):
def __init__(self, routerFactory):
super().__init__(routerFactory)
self.ipAddress = None
</code></pre>
<p>然后我们做wamp.RouterSessionFactory公司子类使用IncomingServerSession</p>
^{pr2}$
<p>最后,我们将子类websocket.WampWebSocketServer协议并设置ipAddress实例变量。因为我们在onOpen回调中,所以我们可以访问peer和HTTP头。我的服务器是反向代理的,所以我要在对等服务器上寻找一个自定义的HTTP报头。在</p>
<pre><code>class IncomingServerProtocol(websocket.WampWebSocketServerProtocol):
def onOpen(self):
try:
self._session = self.factory._factory()
# Use your own header or just the peer if not reverse-proxied
self._session.ipAddress = (self.http_headers.get('x-real-ip') or self.peer)
self._session.onOpen(self)
except Exception as e:
if self.factory.debug_wamp:
traceback.print_exc()
# # Exceptions raised in onOpen are fatal ..
reason = "WAMP Internal Error ({})".format(e)
self._bailout(protocol.WebSocketProtocol.CLOSE_STATUS_CODE_INTERNAL_ERROR, reason=reason)
</code></pre>
<p><strong>下面是我们如何在RPC调用中访问对等方的IP:</strong></p>
<pre><code>@asyncio.coroutine
def onJoin(self, details):
def event(e, details):
caller_session_id = details.caller
caller_session = self._transport._router._dealer._session_id_to_session[caller_session_id]
print(caller_session.ipAddress)
#discloseCaller needs to be True
yield from self.register(event, "abc.event", options=RegisterOptions(details_arg='details', discloseCaller=True))
</code></pre>
<p><strong>最后,我们需要更新初始化代码以使用我们的子类:</strong></p>
<pre><code>router_factory = wamp.RouterFactory()
session_factory = IncomingServerSessionFactory(router_factory)
session_factory.add(IncomingComponent())
transport_factory = websocket.WampWebSocketServerFactory(session_factory, debug=False, debug_wamp=False)
transport_factory.protocol = IncomingServerProtocol
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()
</code></pre>
<p><strong>在官方支持之前你就是这样做的!</strong></p>