【问题标题】:Twisted Perspective Broker with AutobahnPython使用 AutobahnPython 的 Twisted Perspective Broker
【发布时间】:2013-11-01 19:27:34
【问题描述】:

我已经脱离了我的舒适区,我有点困惑我应该如何登录。

Autobahn 提供了一种使用 RPC 调用 Python 服务器的方法,但是 Twisted 似乎只提供了有关如何将 Twisted 用于客户端的文档。

为了正确解释我的意思,这是代码:

在 Javascript 中,您可以像这样调用 RPC 函数: sess.call(url, user, pass)

Python 客户端代码:

from twisted.spread import pb
from twisted.internet import reactor
from twisted.cred import credentials

class Client(pb.Referenceable):

    def remote_print(self, message):
        print message

    def connect(self):
        factory = pb.PBClientFactory()
        reactor.connectTCP("localhost", 8800, factory)
        def1 = factory.login(credentials.UsernamePassword("Bob", "secret"),
                             client=self)
        def1.addCallback(self.connected)
        reactor.run()

    def connected(self, perspective):
        self.perspective = perspective

        d = perspective.callRemote("joinGroup", "#Magic")
        d.addCallback(self.gotGroup)

    def gotGroup(self, group):
        d = group.callRemote("send", "Test message.")
        d.addCallback(self.shutdown)

    def shutdown(self, result):
        reactor.stop()


Client().connect()

Python 服务器代码:

from zope.interface import implements

from twisted.cred import portal, checkers
from twisted.spread import pb
from twisted.internet import reactor

class ChatServer:
    def __init__(self):
        self.groups = {'#Magic':Group('#Magic')} # indexed by name

    def joinGroup(self, groupname, user):
        if self.groups.has_key(groupname):
            self.groups[groupname].addUser(user)
        return self.groups[groupname] or None

class ChatRealm:
    implements(portal.IRealm)
    def requestAvatar(self, avatarID, mind, *interfaces):
        assert pb.IPerspective in interfaces
        avatar = User(avatarID)
        avatar.server = self.server
        avatar.attached(mind)
        return pb.IPerspective, avatar, lambda a=avatar:a.detached(mind)

class User(pb.Avatar):
    def __init__(self, name): self.name = name
    def attached(self, mind): self.remote = mind
    def detached(self, mind): self.remote = None

    def perspective_joinGroup(self, groupname):
        return self.server.joinGroup(groupname, self)

    def send(self, message):
        self.remote.callRemote("print", message)

class Group(pb.Viewable):
    def __init__(self, groupname):
        self.name = groupname
        self.users = []

    def addUser(self, user): self.users.append(user)

    def view_send(self, from_user, message):
        for user in self.users:
            user.send("%s: %s" % (from_user.name, message))

realm = ChatRealm()
realm.server = ChatServer()
checker = checkers.InMemoryUsernamePasswordDatabaseDontUse()
checker.addUser("alice", "1234")
checker.addUser("Bob", "secret")
p = portal.Portal(realm, [checker])

reactor.listenTCP(9000, pb.PBServerFactory(p))
reactor.run()

基本上我只需要了解如何通过 RPC 在 Javascript 中访问登录调用,但我不知道如何做到这一点,而且 Google 没有为我提供任何选项。

【问题讨论】:

    标签: javascript python autobahn


    【解决方案1】:

    Autobahn project不仅提供了WebSocket的实现(其中之一是AutobahnPython),还提供了WAMP (The WebSocket Application Messaging Protocol)

    WAMP 是一个开放的 WebSocket 子协议,它提供了两个异步 消息传递模式:RPC 和 PubSub。

    AutobahnPython 和 AutobahnJS 再次支持 WAMP(以及越来越多的其他实现......请参阅 here.)。似乎 AutobahnJS 和 AutobahnPython 可以让你做你想做的事:

    • 通过浏览器中运行的 JavaScript 通过 WebSocket 在服务器上调用远程过程(用 Python/Twisted/AutobahnPython 编写)
    • 使用 Python/Twisted/AutobahnPython(或其他)中的代理再次从 JavaScript 发布和订阅。

    免责声明:我是 Autobahn 和 WAMP 的原作者,为 Tavendo 工作。

    在 Autobahn 站点和各自的 GitHub 存储库中有多个完整的 RPC 和 PubSub 工作示例,例如here.

    【讨论】:

    • 我访问过您的网站并查看了所有文档。虽然有很多很好的例子,但似乎没有任何内容涵盖透视代理,而且我对 pb 的了解还不够,无法使其仅与 rpc 一起使用。因此,为什么我的问题是问你如何在高速公路上做 pb,而不是我已经知道的可能。
    猜你喜欢
    • 1970-01-01
    • 2013-09-28
    • 2016-01-21
    • 2013-08-14
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多