Skip to main content
 首页 » 编程设计

Python 扭曲错误 : "Request.write called on a request after Request.finish was called"

2025年05月04日13yyy_WW

我是 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() 

请您参考如下方法:

我终于找到了解决方案。代码必须修改如下。\ 第二个 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()