[Twisted-Python] newbie: connecting to a PB service from a web resource
Hi all, I'm trying to build a small webapp that will allow me to connect to a remote PB service. Results from the remote calls are to be used in a simple DOM template. Is this feasable ? I've got all the building blocks functioning alright, using the pbquote.py and pbquoteclient.py code as examples. However, when I try to integrate the code from the commandline client into the dom resource, I'm lost. How can I make sure the client waits a while -- until all callbacks are handled ? I can see the refcount growing on the server side each time I connect to the clientside webserver. But how to disconnect. Clues or pointers anyone ? Thanks. -- ________________________________________________________________ Paul Stevens mailto:paul@nfg.nl NET FACILITIES GROUP PGP: finger paul@nfg.nl The Netherlands________________________________http://www.nfg.nl
It's fairly simple, there's just one important detail you're missing -- in order to get a node factory_* to wait for a deferred, you have to return it. (Ah, the joys of async programming.) Since you're also dealing with a series of deferreds, it's even more tricky. Here's what you do: In the factory_getStatus method, get the first Deferred by calling connect. Add a callback to it and make sure you pass the node to the callback. Return the Deferred. (DOMTemplate will know that in order to render this node, it will have to wait for the results of the Deferred.) In the readStatus callback method (whose signature should be modified to accept the node you passed to the callback above), get the second deferred, add the setResult callback to it, and pass the node along to that callback as well. *Return the Deferred*. (DOMTemplate sees that the results of the first Deferred are a second Deferred. It knows that in order to render this node, it will have to wait for the results of the second Deferred.) Finally, in the setResult callback method (whose signature should be modified to accept the node), you have the result data you wish to insert into the node. You also have a reference to the node, since you passed it along though all the callbacks. Mutate the node (clear it, then node.appendChild(self.d.createTextNode("%s", result))) and *Return the node*. (DOMTemplate sees that the results of the second deferred are a node, and it will be inserted into the DOM (in this case, since the returned node is the same as the node that was passed in, nothing happens) and when the DOM is rendered to XML your data will be in it.) Why is this fairly complicated procedure required? Well, in the original factory_getStatus, you call self.connect() which immediately returns a Deferred. You assume that self.result is ready -- this is not the case. Since the data will not be ready until the callback has fired, you have to defer doing the actual work until the callback, as well. Donovan On Friday, November 1, 2002, at 05:59 AM, Paul Stevens wrote:
Hi all,
I'm trying to build a small webapp that will allow me to connect to a remote PB service. Results from the remote calls are to be used in a simple DOM template.
Is this feasable ?
I've got all the building blocks functioning alright, using the pbquote.py and pbquoteclient.py code as examples.
However, when I try to integrate the code from the commandline client into the dom resource, I'm lost.
How can I make sure the client waits a while -- until all callbacks are handled ?
I can see the refcount growing on the server side each time I connect to the clientside webserver. But how to disconnect.
Clues or pointers anyone ? Thanks.
-- ________________________________________________________________ Paul Stevens mailto:paul@nfg.nl NET FACILITIES GROUP PGP: finger paul@nfg.nl The Netherlands________________________________http://www.nfg.nl <webstatusreporter.py>
Donovan, It works ! Way cool. Thanks for your indepth and lucid explanation. greetings, Fri, 1 Nov 2002 07:38:27 -0800 Donovan Preston <dp@twistedmatrix.com> quoth:
It's fairly simple, there's just one important detail you're missing -- in order to get a node factory_* to wait for a deferred, you have to return it. (Ah, the joys of async programming.) Since you're also dealing with a series of deferreds, it's even more tricky. Here's what you do:
In the factory_getStatus method, get the first Deferred by calling connect. Add a callback to it and make sure you pass the node to the callback. Return the Deferred. (DOMTemplate will know that in order to render this node, it will have to wait for the results of the Deferred.)
In the readStatus callback method (whose signature should be modified to accept the node you passed to the callback above), get the second deferred, add the setResult callback to it, and pass the node along to that callback as well. *Return the Deferred*. (DOMTemplate sees that the results of the first Deferred are a second Deferred. It knows that in order to render this node, it will have to wait for the results of the second Deferred.)
Finally, in the setResult callback method (whose signature should be modified to accept the node), you have the result data you wish to insert into the node. You also have a reference to the node, since you passed it along though all the callbacks. Mutate the node (clear it, then node.appendChild(self.d.createTextNode("%s", result))) and *Return the node*. (DOMTemplate sees that the results of the second deferred are a node, and it will be inserted into the DOM (in this case, since the returned node is the same as the node that was passed in, nothing happens) and when the DOM is rendered to XML your data will be in it.)
Why is this fairly complicated procedure required? Well, in the original factory_getStatus, you call self.connect() which immediately returns a Deferred. You assume that self.result is ready -- this is not the case. Since the data will not be ready until the callback has fired, you have to defer doing the actual work until the callback, as well.
Donovan
On Friday, November 1, 2002, at 05:59 AM, Paul Stevens wrote:
Hi all,
I'm trying to build a small webapp that will allow me to connect to a remote PB service. Results from the remote calls are to be used in a simple DOM template.
Is this feasable ?
I've got all the building blocks functioning alright, using the pbquote.py and pbquoteclient.py code as examples.
However, when I try to integrate the code from the commandline client into the dom resource, I'm lost.
How can I make sure the client waits a while -- until all callbacks are handled ?
I can see the refcount growing on the server side each time I connect to the clientside webserver. But how to disconnect.
Clues or pointers anyone ? Thanks.
-- ________________________________________________________________ Paul Stevens mailto:paul@nfg.nl NET FACILITIES GROUP PGP: finger paul@nfg.nl The Netherlands________________________________http://www.nfg.nl <webstatusreporter.py>
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
-- ________________________________________________________________ Paul Stevens mailto:paul@nfg.nl NET FACILITIES GROUP PGP: finger paul@nfg.nl The Netherlands________________________________http://www.nfg.nl
participants (2)
-
Donovan Preston -
Paul Stevens