dry
dry

Reputation: 841

Python twisted error : "Request.write called on a request after Request.finish was called"

I am new to Twisted and I can't understand why do I get this error while running my script.\

Basically, the script is composed of 2 pages, the first one is a HTML form that calls itself execute a blocking method and display the results. When requests are sent to the server simultaneously I got this error:

exceptions.RuntimeError: Request.write called on a request after Request.finish was called

Do you have any idea where it can come from ?

class FormPage(Resource):    
    def render_GET(self, request):
        return
               <html>
                  <body>
                      <form method="POST">
                          <input name="the-field" type="text" />
                          <input type='submit' name='Get udl' />
                      </form>
                  </body>
               </html>

    def render_POST(self, request):
        deferred= deferToThread(my_blocking_method, arg1, arg2)
        deferred.addCallback(self.print_success, request)
        deferred.addCallback(self.print_failure, request)
        return NOT_DONE_YET

    def print_success(self, result, request):
        request.write('Request executed successfully')
        request.finish()


   def print_failure(self, err, request):
        request.write(str(err))
        request.finish()      

def run()
    root = Resource()
    root.putChild("form", FormPage())
    factory = Site(root)
    reactor.listenTCP(8880, factory)
    reactor.run()

Upvotes: 2

Views: 1818

Answers (1)

dry
dry

Reputation: 841

I finally found the solution. The code has to be modified as follow.\ The line with the second addCallback needs to be changed to addErrback.

class FormPage(Resource):    
    def render_GET(self, request):
        return
            <html>
                <body>
                      <form method="POST">
                          <input name="the-field" type="text" />
                          <input type='submit' name='Get udl' />
                      </form>
                  </body>
               </html>

    def render_POST(self, request):
        deferred= deferToThread(my_blocking_method, arg1, arg2)
        deferred.addCallback(self.print_success, request)
        deferred.addErrback(self.print_failure, request)
        return NOT_DONE_YET

    def print_success(self, result, request):
        request.write('Request executed successfully')
        request.finish()


    def print_failure(self, err, request):
        request.write(str(err))
        request.finish()      

    def run()
        root = Resource()
        root.putChild("form", FormPage())
        factory = Site(root)
        reactor.listenTCP(8880, factory)
        reactor.run()

Upvotes: 1

Related Questions