2017-06-05 68 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