2017-06-05 24 views
0

目前我收到以下错误,因为标题暗示。下面是我使用Autobahn扭曲库的Web Socket代码。当我实例化WsProtocolFactory时,我想将协议设置为WsProtocol,并使用defaultdict对工厂进行初始化以供要订阅的主题。(Twisted-Autobahn)exceptions.AttributeError:'WsProtocol'对象没有属性'factory'

我最初的想法是为WsProtocol__init_添加一个factory参数,但一直无法解决该错误。

任何帮助将不胜感激。

谢谢!

编辑:加入追踪误差

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' 

编辑:正确的代码,工程

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): 
     super(WsProtocolFactory, self).__init__() 
     self.topics = defaultdict(set) 

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

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) 
+0

请编辑您的问题,以包括完整的追溯 –

+0

@ Jean-PaulCalderone我已包括完整的追溯 – Brian

回答

1

定义你的工厂的buildProtocol所以给它建立一个factory属性的协议:

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

设定出厂这种方法是有很多不同的使用双绞线代码的假定普遍惯例。

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

我们再来看看buildProtocol。你的类重写基实现的buildProtocol这确实是这样的:

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

你的版本首先引起AttributeError的(对于factory)没有重新实现相当所有的这种行为和修复是更新的版本,所以它接近原始。

我的猜测是,WebSocketServerFactory.__init__有一些额外的行为,你的子类的__init__有破坏。修复方法是复制它或(更好地)调用基本实现。

+0

谢谢。这修正了原来的错误。但是,我有另一个'AttributeError',我已经添加到原始帖子。 – Brian

+0

我为'WsProtocolFactory'自定义的'__init__'增加了'super(WsProtocolFactory,self).__ init __()',我可以使websocket连接并发送数据。谢谢! – Brian

+0

将在我原来的帖子中添加正确的代码。 – Brian