响应HTTP 200并继续处理

2024-06-14 19:48:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我也不能使用线程、进程、任务、队列或任何其他方法来启动并行“进程”

我的方法是使用内置的“简单HTTP”服务器,我正在寻找一种方法来强制服务器用HTTP200响应,然后能够继续处理

当前代码将收到POST请求,并在3秒钟后打印其内容。我把一个占位符放在我想发送回复的地方

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

Tags: 方法importself服务器servertime进程def
1条回答
网友
1楼 · 发布于 2024-06-14 19:48:56

我想出了一个解决办法。您可以使用以下两个命令强制服务器发送200ok并继续处理:

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

这个答案来自于这样一个问题: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()

相关问题 更多 >