(Twisted-Autobahn)exceptions.AttributeError:' WsProtocol'对象没有属性' factory'

时间:2017-06-05 23:04:15

标签: python websocket twisted autobahn twisted.internet

目前我收到以下错误,如标题所示。我的代码是使用Autobahn的扭曲库的Web Socket,如下所示。当我实例化//file.cpp #include "file.hpp" int (*myClass::foo())[2]{ test_array[2][2]={ {10,20}, {30, 40} }; //defining here - ERROR!! int arr[2][2]= { {1, 10}, {20, 30} }; return arr; } 时,我想将协议设置为WsProtocolFactory并使用WsProtocol初始化工厂以供订阅的主题。

我最初的想法是向defaultdict factory添加WsProtocol参数,但无法解决错误。

非常感谢任何帮助。

谢谢!

编辑:添加了追溯错误

__init_

这是我的代码

Unhandled Error
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 84, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 81, in callWithContext
    return func(*args,**kw)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/posixbase.py", line 597, in _doReadOrWrite
    why = selectable.doRead()
--- <exception caught here> ---
  File "/usr/lib64/python2.7/site-packages/twisted/internet/tcp.py", line 1074, in doRead
    protocol.makeConnection(transport)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/protocol.py", line 494, in makeConnection
    self.connectionMade()
  File "/usr/lib/python2.7/site-packages/autobahn/twisted/websocket.py", line 95, in connectionMade
    self._connectionMade()
  File "/usr/lib/python2.7/site-packages/autobahn/websocket/protocol.py", line 2426, in _connectionMade
    WebSocketProtocol._connectionMade(self)
  File "/usr/lib/python2.7/site-packages/autobahn/websocket/protocol.py", line 962, in _connectionMade
    setattr(self, configAttr, getattr(self.factory, configAttr))
exceptions.AttributeError: 'WsProtocol' object has no attribute 'factory'

Unhandled Error
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 101, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 84, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 81, in callWithContext
    return func(*args,**kw)
--- <exception caught here> ---
  File "/usr/lib64/python2.7/site-packages/twisted/internet/posixbase.py", line 597, in _doReadOrWrite
    why = selectable.doRead()
  File "/usr/lib64/python2.7/site-packages/twisted/internet/tcp.py", line 209, in doRead
    return self._dataReceived(data)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/tcp.py", line 215, in _dataReceived
    rval = self.protocol.dataReceived(data)
  File "/usr/lib/python2.7/site-packages/autobahn/twisted/websocket.py", line 132, in dataReceived
    self._dataReceived(data)
  File "/usr/lib/python2.7/site-packages/autobahn/websocket/protocol.py", line 1175, in _dataReceived
    if self.state == WebSocketProtocol.STATE_OPEN:
exceptions.AttributeError: 'WsProtocol' object has no attribute 'state'

Unhandled Error
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/twisted/internet/task.py", line 936, in react
    _reactor.run()
  File "/usr/lib64/python2.7/site-packages/twisted/internet/base.py", line 1194, in run
    self.mainLoop()
  File "/usr/lib64/python2.7/site-packages/twisted/internet/base.py", line 1206, in mainLoop
    self.doIteration(t)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/epollreactor.py", line 396, in doPoll
    log.callWithLogger(selectable, _drdw, selectable, fd, event)
--- <exception caught here> ---
  File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 101, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 84, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 81, in callWithContext
    return func(*args,**kw)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/posixbase.py", line 610, in _doReadOrWrite
    self._disconnectSelectable(selectable, why, inRead)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/posixbase.py", line 258, in _disconnectSelectable
    selectable.connectionLost(failure.Failure(why))
  File "/usr/lib64/python2.7/site-packages/twisted/internet/tcp.py", line 293, in connectionLost
    protocol.connectionLost(reason)
  File "web_autobahn.py", line 77, in connectionLost
    WebSocketServerProtocol.connectionLost(self, reason)
  File "/usr/lib/python2.7/site-packages/autobahn/twisted/websocket.py", line 129, in connectionLost
    self._connectionLost(reason)
  File "/usr/lib/python2.7/site-packages/autobahn/websocket/protocol.py", line 2437, in _connectionLost
    WebSocketProtocol._connectionLost(self, reason)
  File "/usr/lib/python2.7/site-packages/autobahn/websocket/protocol.py", line 1075, in _connectionLost
    if not self.factory.isServer and self.serverConnectionDropTimeoutCall is not None:
exceptions.AttributeError: 'WsProtocol' object has no attribute 'factory'

编辑:新追溯

from datetime import datetime
from collections import defaultdict

from twisted.web import resource, server
from twisted.internet.task import react
from twisted.internet import reactor
from twisted.internet.defer import DeferredList, Deferred
from twisted.internet.endpoints import TCP4ServerEndpoint
from autobahn.twisted.websocket import WebSocketServerProtocol, WebSocketServerFactory
from schema import schema
import json
import os
import sys
from twisted.python import log

def log(msg):
    print("{}: {}".format(str(datetime.now()), msg))


class WsProtocol(WebSocketServerProtocol):
    """Dummy websocket protocol"""
    def __init__(self, topics):
        super(WsProtocol, self).__init__()
        self.topics = topics
        self.subscribed_topic = None
        log("WS protocol init")

    def onConnect(self, request):
        print("WebSocket connected.")

    def onOpen(self):
        print("WebSocket connection open.")

    def onMessage(self, payload, isBinary):
        log(payload)
        self.sendMessage("Message received")        

    def onClose(self, wasClean, code, reason):
        print("WebSocket connection closed: {}".format(reason))

    def connectionLost(self, reason):
        WebSocketServerProtocol.connectionLost(self, reason)
        log("Connection closed: Reason is {}".format(reason))

class WsProtocolFactory(WebSocketServerFactory):

    def __init__(self):
        self.topics = defaultdict(set)

    def buildProtocol(self, *args, **kwargs):
        return WsProtocol(self.topics)

def setup_protocols(reactor):
    factories = {
        WsProtocolFactory: 9001,
    }

    for factory, port in factories.items():
        endpoint = TCP4ServerEndpoint(reactor, port)
        endpoint.listen(factory())
        log("Bound port {} to protocol {}".format(str(port), factory))
    return Deferred()



if __name__ == '__main__':
    react(setup_protocols)

编辑:正确的代码

Unhandled Error
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 84, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 81, in callWithContext
    return func(*args,**kw)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/posixbase.py", line 597, in _doReadOrWrite
    why = selectable.doRead()
--- <exception caught here> ---
  File "/usr/lib64/python2.7/site-packages/twisted/internet/tcp.py", line 1074, in doRead
    protocol.makeConnection(transport)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/protocol.py", line 494, in makeConnection
    self.connectionMade()
  File "/usr/lib/python2.7/site-packages/autobahn/twisted/websocket.py", line 95, in connectionMade
    self._connectionMade()
  File "/usr/lib/python2.7/site-packages/autobahn/websocket/protocol.py", line 2426, in _connectionMade
    WebSocketProtocol._connectionMade(self)
  File "/usr/lib/python2.7/site-packages/autobahn/websocket/protocol.py", line 962, in _connectionMade
    setattr(self, configAttr, getattr(self.factory, configAttr))
exceptions.AttributeError: 'WsProtocolFactory' object has no attribute 'logOctets'

Unhandled Error
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 101, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 84, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 81, in callWithContext
    return func(*args,**kw)
--- <exception caught here> ---
  File "/usr/lib64/python2.7/site-packages/twisted/internet/posixbase.py", line 597, in _doReadOrWrite
    why = selectable.doRead()
  File "/usr/lib64/python2.7/site-packages/twisted/internet/tcp.py", line 209, in doRead
    return self._dataReceived(data)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/tcp.py", line 215, in _dataReceived
    rval = self.protocol.dataReceived(data)
  File "/usr/lib/python2.7/site-packages/autobahn/twisted/websocket.py", line 132, in dataReceived
    self._dataReceived(data)
  File "/usr/lib/python2.7/site-packages/autobahn/websocket/protocol.py", line 1175, in _dataReceived
    if self.state == WebSocketProtocol.STATE_OPEN:
exceptions.AttributeError: 'WsProtocol' object has no attribute 'state'

Unhandled Error
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/twisted/internet/task.py", line 936, in react
    _reactor.run()
  File "/usr/lib64/python2.7/site-packages/twisted/internet/base.py", line 1194, in run
    self.mainLoop()
  File "/usr/lib64/python2.7/site-packages/twisted/internet/base.py", line 1206, in mainLoop
    self.doIteration(t)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/epollreactor.py", line 396, in doPoll
    log.callWithLogger(selectable, _drdw, selectable, fd, event)
--- <exception caught here> ---
  File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 101, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 84, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 81, in callWithContext
    return func(*args,**kw)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/posixbase.py", line 610, in _doReadOrWrite
    self._disconnectSelectable(selectable, why, inRead)
  File "/usr/lib64/python2.7/site-packages/twisted/internet/posixbase.py", line 258, in _disconnectSelectable
    selectable.connectionLost(failure.Failure(why))
  File "/usr/lib64/python2.7/site-packages/twisted/internet/tcp.py", line 293, in connectionLost
    protocol.connectionLost(reason)
  File "web_autobahn.py", line 77, in connectionLost
    WebSocketServerProtocol.connectionLost(self, reason)
  File "/usr/lib/python2.7/site-packages/autobahn/twisted/websocket.py", line 129, in connectionLost
    self._connectionLost(reason)
  File "/usr/lib/python2.7/site-packages/autobahn/websocket/protocol.py", line 2437, in _connectionLost
    WebSocketProtocol._connectionLost(self, reason)
  File "/usr/lib/python2.7/site-packages/autobahn/websocket/protocol.py", line 1082, in _connectionLost
    if self.autoPingPendingCall:
exceptions.AttributeError: 'WsProtocol' object has no attribute 'autoPingPendingCall'

1 个答案:

答案 0 :(得分:1)

定义您的工厂buildProtocol,以便为其构建factory属性的协议:

def buildProtocol(self, *args, **kwargs):
    protocol = WsProtocol(self.topics)
    protocol.factory = self
    return protocol

以这种方式设置工厂是许多不同的使用Twisted代码所假设的普遍惯例。

我不确定logOctets是什么,但我的猜测是这是由类似问题引起的。

让我们再看看buildProtocol。您的类将覆盖buildProtocol的基本实现,其执行类似:

def buildProtocol(self, *args, **kwargs):
    protocol = self.protocol()
    protocol.factory = self
    return protocol

您的版本导致第一个AttributeError(对于factory)没有重新执行所有这些行为,修复程序是更新您的版本,使其更接近原始版本。

我的猜测是WebSocketServerFactory.__init__有一些额外的行为,而你的子类__init__已经破坏了它。修复是要么复制它,要么(更好)调用基础实现。