响应HTTP 200并继续处理

时间:2019-07-01 12:29:28

标签: python python-3.x

我有一个场景,我需要首先用HTTP 200响应服务器请求(由于时间限制),然后继续处理实际工作。

我也不能使用线程,进程,任务,队列或任何其他允许我通过启动并行“进程”来执行此操作的方法。

我的方法是使用“简单HTTP”服务器中的构建,我正在寻找一种方法来强制服务器使用HTTP 200进行响应,然后能够继续进行处理。

当前代码将在3秒钟后收到POST请求并打印其内容。我将占位符放在要发送响应的位置。

from http.server import BaseHTTPRequestHandler, HTTPServer
import time

class MyWebServer(BaseHTTPRequestHandler):    
    def do_POST(self):        
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)        
        self.send_response_only(200)
        self.end_headers()
        # force server to send request ???
        time.sleep(3)
        print(post_data)        

def run(server_class=HTTPServer, handler_class=MyWebServer, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print('Starting httpd...')
    httpd.serve_forever()

if __name__ == "__main__":
    run()

1 个答案:

答案 0 :(得分:0)

我想出了一种解决方法。您可以强制服务器发送200 OK,然后使用以下两个命令继续处理:

self.finish()
self.connection.close()

此解决方案来自以下SO问题:SimpleHTTPRequestHandler close connection before returning from do_POST method

但是,这显然会关闭服务器使用的内部IO缓冲区,并且此后将无法处理任何其他请求。

为避免遇到异常,它可以终止程序(对我而言有效)。但是,这只是一种解决方法,我仍将在寻找一种解决方案,以允许服务器继续处理新请求。

from http.server import BaseHTTPRequestHandler, HTTPServer
import time

class MyHandler(BaseHTTPRequestHandler):    
    def do_POST(self):        
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)        
        self.send_response_only(200)
        self.end_headers()
        self.finish()
        self.connection.close()                    
        time.sleep(3)
        print(post_data)
        quit()

def run(server_class=HTTPServer, handler_class=MyHandler, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print('Starting httpd...')
    httpd.serve_forever()

if __name__ == "__main__":   
    run()