2

我是 Twisted 的新手,我不明白为什么在运行脚本时会出现此错误。\

基本上,脚本由 2 个页面组成,第一个是一个 HTML 表单,它调用自己执行一个阻塞方法并显示结果。当请求同时发送到服务器时,我收到此错误:

exceptions.RuntimeError: Request.write 在调用 Request.finish 后调用请求

你知道它来自哪里吗?

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()
4

1 回答 1

1

我终于找到了解决方案。代码必须修改如下。\ 第二个 addCallback 的行需要更改为 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()
于 2011-12-06T16:05:27.460 回答