Python3使用http.server时如何将handle_request()处理的请求保存为变量
Python3 http.server捕获请求到变量实现方案
默认SimpleHTTPRequestHandler处理请求后不会将请求内容返回给外层,你需要自定义请求处理类,将请求信息绑定到HTTPServer实例上再读取,具体实现如下:
完整代码示例
from http.server import HTTPServer, SimpleHTTPRequestHandler # 自定义请求处理类 class CaptureRequestHandler(SimpleHTTPRequestHandler): # 处理GET请求 def do_GET(self): # 组装请求信息,按需增减字段 request_info = { "method": self.command, "path": self.path, "protocol": self.request_version, "headers": dict(self.headers), "client_addr": self.client_address } # 将请求信息绑定到server实例属性 self.server.captured_request = request_info # 可选:给客户端返回正常响应,不需要可删除 self.send_response(200) self.send_header("Content-Type", "text/plain;charset=utf-8") self.end_headers() self.wfile.write("请求已捕获".encode("utf-8")) # 处理POST请求,需要其他方法同理添加 def do_POST(self): # 读取请求体 content_len = int(self.headers.get("Content-Length", 0)) request_body = self.rfile.read(content_len) # 组装请求信息 request_info = { "method": self.command, "path": self.path, "protocol": self.request_version, "headers": dict(self.headers), "client_addr": self.client_address, "body": request_body } self.server.captured_request = request_info # 可选:返回响应 self.send_response(200) self.end_headers() self.wfile.write(b"ok") if __name__ == "__main__": # 初始化服务 httpd = HTTPServer(("127.0.0.1", 8000), CaptureRequestHandler) # 初始化存储请求的属性 httpd.captured_request = None # 处理一次请求后自动停止 httpd.handle_request() # 读取捕获到的请求变量 request_variable = httpd.captured_request # 后续可直接解析request_variable print(request_variable)
说明
- 如果不需要给请求方返回响应,可以删除对应方法里构造响应的代码,客户端会收到连接断开提示
- 可以按需调整
request_info里存储的字段,比如要获取原始请求行、请求体解码后的内容等都可以直接从handler的属性里读取 - 要支持PUT/DELETE等其他HTTP方法,只需对应添加
do_PUT/do_DELETE方法,逻辑和GET/POST一致
内容的提问来源于stack exchange,提问作者Stathis Kapnidis
相关产品推荐
相关产品推荐

