[Twisted-Python] attribute error when I am trying to make one factory to send data to another

Jessica Tsui jesadjust at gmail.com
Tue Apr 28 12:41:47 MDT 2015


Pantellis thank you so much for your guide! I am still quite unfamiliar
with python and twisted so I made all kind of silly mistakes and could not
figure out how to fix them

I tried your code, it seems to me that it should be working with by
referencing the factories as well as the self.app...Unfortunately when I
ran it it did not work well, the program has an error with your line

            for echoer in self.app.multiechofactory.echoers:
                echoer.dataReceived(sendermessage)

The error is: exceptions.AttributeError: MultiEcho instance has no
attribute 'app'

I thought that the "app" has already been referenced?

2015-04-29 1:55 GMT+08:00 Pantelis Theodosiou <ypercube at gmail.com>:

>
> On Tue, Apr 28, 2015 at 6:46 PM, Pantelis Theodosiou <ypercube at gmail.com>
> wrote:
>
>> No, I don't think that would work.
>>
>> You would need something like changing these lines:
>>
>>         reactor.listenTCP(8000, EchoFactory(self))  # for sender
>>         reactor.listenTCP(8001, MultiEchoFactory(self))  # for receiver
>>
>> to:
>>
>>         self.echofactory = EchoFactory(self)
>>         self.multiechofactory = MultiEchoFactory(self)
>>         reactor.listenTCP(8000, self.echofactory)  # for sender
>>         reactor.listenTCP(8001, self.multiechofactory)  # for receiver
>>
>> so, your "app" object (which is just a normal Python object) knows the
>> other two objects (the instances of the 2 factories).
>>
>> Then, your calls:
>>
>>         if sendermessage:
>>             self.transport.write(data)
>>             #this line here is the trouble maker that caused the error
>>             MultiEcho().dataReceived(sendermessage)
>>
>> could be written:
>>
>>         if sendermessage:
>>             self.transport.write(data)
>>
>>             self.app.multiechofactory.dataReceived(sendermessage)
>>
>
>
> Oh, I messed it up. The first part is good but the factories do not have
> dataReceived methods.
>
> It would have to be - depending on what you want to do - say, you want to
> echo to all echoers:
>
>         if sendermessage:
>             self.transport.write(data)
>
>             for echoer in self.app.multiechofactory.echoers:
>                 echoer.dataReceived(sendermessage)
>
> or:
>
>         if sendermessage:
>             self.transport.write(data)
>
>             self.app.multiechofactory.echo_them_all()
>
> and define the echo_them_all() method in the MultiEchoFactory() class.
>
>
>
>>
>> On Tue, Apr 28, 2015 at 6:28 PM, Jessica Tsui <jesadjust at gmail.com>
>> wrote:
>>
>>> Hi Daniel,
>>>
>>>   Thank you so much for your suggestion. I am quite new to python and
>>> twisted so I am not very certain about how to make it work well. Does that
>>> mean if I change the dataReceived by adding a line to instantiate the
>>> MultiEchoFactory like this, it will work?
>>>
>>> def dataReceived(self, data):
>>>     "As soon as any data is received, write it back."
>>>     handlesendermessage = self.factory.app.handle_message(data)
>>>
>>>     if handlesendermessage:
>>>         self.transport.write(data)
>>>         MultiEchoFactory()
>>>         MultiEcho().dataReceived(data)
>>>
>>>
>>> 2015-04-29 0:33 GMT+08:00 Louis D. Burr <ldanielburr at me.com>:
>>>
>>>> Hi Jessica,
>>>>
>>>> On Apr 28, 2015, at 10:14 AM, Jessica Tsui <jesadjust at gmail.com> wrote:
>>>>
>>>> SNIP
>>>>
>>>>  exceptions.AttributeError: MultiEcho instance has no attribute ‘factory'
>>>>
>>>> SNIP
>>>>
>>>> MultiEcho().dataReceived(sendermessage)
>>>>
>>>> Here you create an instance of the protocol directly, i.e., without
>>>> having instantiated a MutilEchoFactory.  The factory’s buildProtocol method
>>>> is what assigns the factory instance as a member of the protocol
>>>> (self.factory), and since you didn’t create the protocol via a factory, you
>>>> have no factory attribute on your protocol instance.
>>>>
>>>> There are a number of ways to fix this, but generally speaking, you
>>>> need to provide a way for your factories and their protocols to be aware of
>>>> each other.
>>>>
>>>> Hope this helps,
>>>>
>>>> Daniel
>>>> --
>>>> L. Daniel Burr
>>>> ldanielburr at me.com
>>>> (312) 656-8387
>>>>
>>>>
>>>> _______________________________________________
>>>> Twisted-Python mailing list
>>>> Twisted-Python at twistedmatrix.com
>>>> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Twisted-Python mailing list
>>> Twisted-Python at twistedmatrix.com
>>> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>>>
>>>
>>
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/twisted-python/attachments/20150429/49b0a584/attachment-0002.html>


More information about the Twisted-Python mailing list