При работе с Autobahn и WAMP до того, как я использовал подход к подклассам, но наткнулся на подход декоратора/функций, который я действительно предпочитаю подклассам.
Однако. У меня есть функция, которая вызывается с внешнего оборудования (через обратный вызов), и эта функция должна публиковаться на маршрутизаторе Crossbar.io всякий раз, когда она вызывается.
Вот как я это сделал, сохранив ссылку на Session
сразу после вызова on_join -> async def joined(session, details)
.
from autobahn.asyncio.component import Component
from autobahn.asyncio.component import run
global_session = None
comp = Component(
transports=u"ws://localhost:8080/ws",
realm=u"realm1",
)
def callback_from_hardware(msg):
if global_session is None:
return
global_session.publish(u'com.someapp.somechannel', msg)
@comp.on_join
async def joined(session, details):
global global_session
global_session = session
print("session ready")
if __name__ == "__main__":
run([comp])
Однако такой подход сохранения ссылки после того, как компонент присоединился к соединению, кажется немного «странным». Есть ли другой подход к этому? Может это сделать по-другому.
Если нет, то это кажется немного более «правильным» с подклассами и наличием всего кода, зависящего от приложения, в этом подклассе (но, тем не менее, сохранение всего моего приложения в одном подклассе также кажется странным).