【问题标题】:Controlling Twisted based server from a web interface?从 Web 界面控制基于 Twisted 的服务器?
【发布时间】:2013-02-15 07:04:44
【问题描述】:

我使用 Twisted 创建了一个具有自定义协议的服务器,并且我有客户端连接到特定端口(例如端口 1234)上的服务器。我希望基于某种网页为服务器创建一个控制界面。到目前为止,我的研究表明 Nevow 是受欢迎的选择,但我只需要一些非常简单的东西。

例如,每次浏览器访问端口 8080 上的 hello world 页面时,我都会向连接在 1234 上的客户端发送一条消息。

我有点困惑如何将这两个连接在一起。我假设我需要从 HelloResource.render_GET 调用 Server.message ?

from twisted.internet import protocol, reactor
from twisted.web.resource import Resource

    class Server(protocol.Protocol):
        def dataReceived(self, data):
            #do something on the server side

        def message(self)
            #send message to clients

    class HelloResource(Resource):
        isLeaf = True

        def render_GET(self,request):
            return "<html>Hello, world!</html>"

factory = protocol.Factory()
factory.protocol = Server
reactor.listenTCP(1234, factory)

reactor.listenTCP(8080, server.Site(HelloResource()))

reactor.run()

【问题讨论】:

    标签: python twisted twisted.web twisted.internet


    【解决方案1】:

    这与a question answered in the Twisted FAQ非常相似。

    本质上,您需要使您的工厂创建的协议实例可以访问构成您的网络服务器的资源。

    一个简单的方法是让你的工厂保存一个协议实例列表(如果你还没有阅读buildProtocol),然后将工厂实例传递给你的HelloResource初始化器,然后有那个初始化器将工厂保存为HelloResource 实例上的属性。

    这将HelloResource 访问协议实例列表 - 通过它现在引用的工厂对象 - 然后它可以对其进行迭代,例如,调用每个协议实例上的方法。

    【讨论】:

      【解决方案2】:

      如果您想以这种方式做事,您的Server.message 显然必须是@classmethod,并且它必须有权访问客户列表,并将消息发送给每个客户。

      类似这样的:

      class Server(protocol.Protocol):
          clients = set()
      
          def dataReceived(self, data):
              #do something on the server side
              pass
      
          def connectionMade(self):
              Server.clients.add(self)
      
          def connectionLost(self):
              Server.clients.remove(self)
      
          @classmethod
          def message(cls):
              for client in cls.clients:
                  client.transport.write('got GET request\n')
      

      现在您可以从您的 render_GET 方法中调用 Server.message()

      我不确定这是不是最好的设计——实际上,有各种比协议类更好的对象可以挂载客户端列表——但它应该可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多