Problem using deferreds in a freeform autocallable

Hi, I have a freeform autocallable method which uses a deferred: The method needs to call a function that returns a deferred, and continue only after the deferred fires. Unfortunately, I cannot get it to work: When I return a deferred from the autocallable, I get a traceback which doesn't make sense to me. A test program and the associated traceback are attached. Is this supposed to work? If not, how can I perform a deferred action when posting a form? Thanks, -- Gavrie. from twisted.application import service, internet from twisted.internet import defer from nevow import appserver from nevow import renderer from nevow import tags from nevow import formless from nevow import freeform class IMyForm(formless.TypedInterface): def submit(self, foo=formless.String(), ): pass submit = formless.autocallable(submit) class MyForm(object): __implements__ = IMyForm def submit(self, foo): print "Submit:", foo def _cb(result): print "Callback: %s" % result return result d = defer.Deferred() d.callback("bar") return d class FormPage(renderer.Renderer): document = tags.html[ tags.body[ freeform.configure ] ] application = service.Application("test") internet.TCPServer( 8081, appserver.NevowSite( FormPage(MyForm()) ) ).setServiceParent(application) # vim: ft=python 2003/12/25 13:36 IST [-] Log opened. 2003/12/25 13:36 IST [-] twistd 1.1.0 (/usr/bin/python 2.3.2) starting up 2003/12/25 13:36 IST [-] reactor class: twisted.internet.default.SelectReactor 2003/12/25 13:36 IST [-] Loading formpost-defer.tac... 2003/12/25 13:36 IST [-] /usr/lib/python2.3/site-packages/atop/store.py:36: exceptions.DeprecationWarning: This module is deprecated. 2003/12/25 13:36 IST [-] TODO: add IComponentized to Twisted so that we can do this without relying on getattr magic. 2003/12/25 13:37 IST [-] Loaded. 2003/12/25 13:37 IST [-] nevow.appserver.NevowSite starting on 8081 2003/12/25 13:37 IST [-] Starting factory <nevow.appserver.NevowSite instance at 0xbf1c00ac> 2003/12/25 13:37 IST [-] Main loop terminated. 2003/12/25 13:37 IST [-] Server Shut Down. 2003/12/25 13:37 IST [-] Log opened. 2003/12/25 13:37 IST [-] twistd 1.1.0 (/usr/bin/python 2.3.2) starting up 2003/12/25 13:37 IST [-] reactor class: twisted.internet.default.SelectReactor 2003/12/25 13:37 IST [-] Loading formpost-defer.tac... 2003/12/25 13:37 IST [-] /usr/lib/python2.3/site-packages/atop/store.py:36: exceptions.DeprecationWarning: This module is deprecated. 2003/12/25 13:37 IST [-] TODO: add IComponentized to Twisted so that we can do this without relying on getattr magic. 2003/12/25 13:37 IST [-] Loaded. 2003/12/25 13:37 IST [-] nevow.appserver.NevowSite starting on 8081 2003/12/25 13:37 IST [-] Starting factory <nevow.appserver.NevowSite instance at 0xbf1c10ac> 2003/12/25 13:37 IST [HTTPChannel,0,127.0.0.1] Submit: aaa 2003/12/25 13:37 IST [HTTPChannel,0,127.0.0.1] /usr/lib/python2.3/site-packages/nevow/formless.py:514: exceptions.FutureWarning: %u/%o/%x/%X of negative int will return a signed string in Python 2.4 and up 2003/12/25 13:37 IST [HTTPChannel,0,127.0.0.1] /usr/lib/python2.3/site-packages/twisted/internet/defer.py:357: exceptions.FutureWarning: hex()/oct() of negative int will return a signed string in Python 2.4 and up 2003/12/25 13:37 IST [HTTPChannel,0,127.0.0.1] Traceback (most recent call last): File "/usr/lib/python2.3/site-packages/twisted/protocols/http.py", line 549, in requestReceived self.process() File "/usr/lib/python2.3/site-packages/nevow/appserver.py", line 115, in process return self.site.getResourceFor(self).addCallback( File "/usr/lib/python2.3/site-packages/twisted/internet/defer.py", line 187, in addCallback callbackKeywords=kw) File "/usr/lib/python2.3/site-packages/twisted/internet/defer.py", line 178, in addCallbacks self._runCallbacks() --- <exception caught here> --- File "/usr/lib/python2.3/site-packages/twisted/internet/defer.py", line 307, in _runCallbacks self.result = callback(self.result, *args, **kw) File "/usr/lib/python2.3/site-packages/nevow/appserver.py", line 124, in finishRender self.write(html) File "/usr/lib/python2.3/site-packages/twisted/protocols/http.py", line 677, in write self.sentLength = self.sentLength + len(data) exceptions.TypeError: len() of unsized object 2003/12/25 13:37 IST [HTTPChannel,0,127.0.0.1] /usr/lib/python2.3/site-packages/twisted/web/server.py:266: exceptions.UserWarning: Warning! request.finish called twice. 2003/12/25 13:37 IST [HTTPChannel,0,127.0.0.1] Unhandled error in Deferred: 2003/12/25 13:37 IST [HTTPChannel,0,127.0.0.1] Traceback (most recent call last): File "/usr/lib/python2.3/site-packages/twisted/protocols/http.py", line 549, in requestReceived self.process() File "/usr/lib/python2.3/site-packages/nevow/appserver.py", line 115, in process return self.site.getResourceFor(self).addCallback( File "/usr/lib/python2.3/site-packages/twisted/internet/defer.py", line 187, in addCallback callbackKeywords=kw) File "/usr/lib/python2.3/site-packages/twisted/internet/defer.py", line 178, in addCallbacks self._runCallbacks() --- <exception caught here> --- File "/usr/lib/python2.3/site-packages/twisted/internet/defer.py", line 307, in _runCallbacks self.result = callback(self.result, *args, **kw) File "/usr/lib/python2.3/site-packages/nevow/appserver.py", line 124, in finishRender self.write(html) File "/usr/lib/python2.3/site-packages/twisted/protocols/http.py", line 677, in write self.sentLength = self.sentLength + len(data) exceptions.TypeError: len() of unsized object 2003/12/25 13:37 IST [-] Main loop terminated. 2003/12/25 13:37 IST [-] Server Shut Down.
participants (1)
-
Gavrie Philipson