2017-06-05 3 views
0

Actuellement, j'obtiens l'erreur suivante comme le titre le suggère. Mon code pour un Web Socket utilisant la bibliothèque torsadée d'Autobahn est ci-dessous. Lorsque j'instancie le WsProtocolFactory, je souhaite définir le protocole sur WsProtocol et initialiser l'usine avec un defaultdict pour les sujets auxquels m'abonner.(Twisted-Autobahn) exceptions.AttributeError: L'objet 'WsProtocol' n'a pas d'attribut 'factory'

Ma pensée initiale était d'ajouter un argument factory au WsProtocol__init_, mais n'a pas été en mesure de corriger l'erreur.

Toute aide serait grandement appréciée.

Merci!

EDIT: ajout erreur traceback

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' 

Voici mon code

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) 

EDIT: New retraçage

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' 

EDIT: code correct qui fonctionne

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

s'il vous plaît modifier votre question pour inclure le retraçage complet –

+0

@ Jean-PaulCalderone J'ai inclus le retraçage complet – Brian

Répondre

1

Define donc de votre usine buildProtocol donne les protocoles qu'il construit un attribut factory:

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

Réglage usine de cette façon est une convention largement assumée par beaucoup de code différent torsadée à l'aide.

Je ne sais pas ce que logOctets est mais je suppose que c'est causé par un problème similaire.

Regardons à nouveau buildProtocol. Votre classe remplace l'implémentation de base de buildProtocol qui fait quelque chose comme:

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

Votre version a provoqué la première AttributeError (pour factory) de ne pas réimplémenter tout à fait tout ce comportement et le correctif a été de mettre à jour votre version il était plus proche de l'original.

Ma conjecture est que WebSocketServerFactory.__init__ a un comportement supplémentaire et __init__ de votre sous-classe a cabossé cela. Le correctif consiste à le répliquer ou (mieux) à appeler l'implémentation de base.

+0

Merci. Cela a corrigé l'erreur d'origine. Cependant, j'ai un autre 'AttributeError' que j'ai ajouté à la publication originale. – Brian

+0

J'ai ajouté 'super (WsProtocolFactory, self) .__ init __()' à la définition personnalisée '__init__' pour' WsProtocolFactory' et je suis capable de faire la connexion websocket et d'envoyer des données. Je vous remercie! – Brian

+0

Je vais ajouter le code correct dans mon message d'origine. – Brian