Reputation: 841
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
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