Hi all,

I am writing a restful twisted (8.1.0) server and am trying to return useful error statuses from requests. The problem is that even following the documentation extremely carefully I am getting an AlreadyCalled Error every time I generate a failure. Here is my main class (leaving out code that I feel is not relevant to the question:

from xml.dom import minidom
from twisted.web import server, resource

from FWGException import FWGException

class DeferredPostHandler(resource.Resource,minidom.Document):

    NOT_IMPLEMENTED = 501
    BAD_REQUEST = 400
        
    def writeError(self, failure, request, *args, **kw):
        failure.trap(FWGException)
        request.setResponseCode(self.errorCode)
request.write("Error handling request: %s" % failure.getErrorMessage())
        request.finish()

    def writeResult(self, result, request, *args, **kw):
        self.writexml(request)
        request.finish()

    def render_GET(self, request):
        self.process=self.db.runInteraction(self.processForm,request)
self.process.addCallbacks(self.writeResult, self.writeError, [request], {}, [request], {})
        return server.NOT_DONE_YET


I have a handler that extends this

from DeferredPostHandler import DeferredPostHandler
from twisted.web import http
from twisted.python.failure import Failure
from FWGException import FWGException

class CollectionAdminHandler(DeferredPostHandler):

    def __init__(self, task, db, config):
        DeferredPostHandler.__init__(self,db)
        self.config = config
        self.task = task
        self.errorCode = http.OK

    def processForm(self, cursor, request):

        if self.task == 'add':
            self.addCollection(cursor, request)

        elif self.task == 'delete':
            self.deleteCollection(cursor, request)

        else:
            self.errorCode = DeferredPostHandler.NOT_IMPLEMENTED
            fail = Failure(FWGException("Unsupported Task"))
            self.process.errback(fail)

    def addCollection(self, cursor, request):
        fail = None
        if self.isValidAddRequest(request):
            pass
        else:
            self.errorCode = DeferredPostHandler.BAD_REQUEST
            fail = Failure(FWGException("Missing Parameter"))

        if fail:
            self.process.errback(fail);

    def deleteCollection(self, cursor, request):
        print 'Delete Collection'

    def isValidAddRequest(self, request):
return 'title' in request.args and 'category' in request.args and 'date' in request.args


Unfortunately whenever I call


self.process.errback(fail)

I get the following stack trace in my log


Traceback (most recent call last):
  File "startserver.py", line 23, in <module>
    reactor.run()
File "/Library/Python/2.5/site-packages/Twisted-8.1.0-py2.5- macosx-10.5-i386.egg/twisted/internet/base.py", line 1048, in run
    self.mainLoop()
File "/Library/Python/2.5/site-packages/Twisted-8.1.0-py2.5- macosx-10.5-i386.egg/twisted/internet/base.py", line 1057, in mainLoop
    self.runUntilCurrent()
--- <exception caught here> ---
File "/Library/Python/2.5/site-packages/Twisted-8.1.0-py2.5- macosx-10.5-i386.egg/twisted/internet/base.py", line 677, in runUntilCurrent
    f(*a, **kw)
File "/Library/Python/2.5/site-packages/Twisted-8.1.0-py2.5- macosx-10.5-i386.egg/twisted/internet/defer.py", line 243, in callback
    self._startRunCallbacks(result)
File "/Library/Python/2.5/site-packages/Twisted-8.1.0-py2.5- macosx-10.5-i386.egg/twisted/internet/defer.py", line 298, in _startRunCallbacks
    raise AlreadyCalledError
twisted.internet.defer.AlreadyCalledError:


I can not understand why this is happening :-( Can anybody help?

BTW I am using POST instead of PUT because my client can't do PUT

Conrad Winchester



_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to