我有一个场景,我需要首先用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()
答案 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()