将参数传递给Twisted工厂以传递给会话。

5

我基于twisted sshsimpleserver.py编写了一个sshdaemon,它运行得很好。

http://twistedmatrix.com/documents/current/conch/examples/

但现在我想要向EchoProtocol传递一个命令行参数,以根据该参数更改其行为。我该怎么做?在这种情况下,我想将'options.test'参数传递给我的协议。

[...]

if __name__ == '__main__':
     parser = optparse.OptionParser()
     parser.add_option('-p', '--port', action = 'store', type = 'int', 
dest = 'port', default = 1235, help = 'server port')
     parser.add_option('-t', '--test', action = 'store', type = 
'string', dest = 'test', default = '123')
     (options, args) = parser.parse_args()

     components.registerAdapter(ExampleSession, ExampleAvatar, 
session.ISession)

     [...]

     reactor.listenTCP(options.port, ExampleFactory())
     reactor.run()

由于会话实例是由工厂创建的,因此我似乎无法将附加参数传递给会话构造函数或协议。

我已经尝试将选项名称设置为全局变量,但在协议上下文/范围中不可见。

顺便说一句,我将协议类移动到了自己的文件中,并在主文件中导入它。

1个回答

4
你可以创建自己的工厂并将参数传递给它。参考文档中的示例
from twisted.internet.protocol import Factory, Protocol
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor

class QOTD(Protocol):

    def connectionMade(self):
        # self.factory was set by the factory's default buildProtocol:
        self.transport.write(self.factory.quote + '\r\n')
        self.transport.loseConnection()


class QOTDFactory(Factory):

    # This will be used by the default buildProtocol to create new protocols:
    protocol = QOTD

    def __init__(self, quote=None):
        self.quote = quote or 'An apple a day keeps the doctor away'

endpoint = TCP4ServerEndpoint(reactor, 8007)
endpoint.listen(QOTDFactory("configurable quote"))
reactor.run()

谢谢提供示例和指针,这是一个很好的起点。不幸的是,协议是在ExampleSession中创建的,但是它可以通过protocol.session.conn.transport.factory.quote进行访问。 - Fabian
在 openShell 调用中,我们可以通过 serverProtocol = ServerProtocol(CommandRecvLine, self, quote) 将引号转发到 CommandRecvLine。 - Fabian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接