Python中http.server.BaseHTTPRequestHandler的常见用法
http.server.BaseHTTPRequestHandler 是 Python 标准库中一个用于处理 HTTP 请求的基类。通过继承 BaseHTTPRequestHandler,我们可以自定义处理 HTTP 请求的逻辑。下面是 BaseHTTPRequestHandler 的一些常见用法和示例:
1. 构造函数和请求处理函数:
- 构造函数:BaseHTTPRequestHandler.__init__(self, request, client_address, server)
- request:一个包含请求的字节数据。
- client_address:一个元组,包含客户端的 IP 和端口号。
- server:一个 HTTPServer 对象,用于处理请求。
- 请求处理函数:可以根据具体的 HTTP 方法进行不同的处理,例如 do_GET()、do_POST()、do_PUT() 等。
- do_METHOD():在具体的请求处理函数中,METHOD 表示 HTTP 方法,例如 GET、POST、PUT 等。在这个函数中,可以根据具体的请求内容进行处理,然后通过调用 send_response()、send_header() 和 end_headers() 发送响应头信息,并通过调用 wfile.write() 发送响应内容。
2. 响应头信息的设置:
- send_response(code, message=None):设置响应状态码和状态消息。例如:self.send_response(200, 'OK')。
- send_header(keyword, value):设置响应头的字段值。例如:self.send_header('Content-type', 'text/html')。
- end_headers():通知服务器响应头已经发送完毕。要在 send_header() 调用后调用。
3. 读取请求信息:
- self.rfile.read(size=-1):读取请求的主体内容,size 参数指定要读取的最大字节数。例如:data = self.rfile.read(int(self.headers.get('Content-Length', 0)))。
- self.headers:一个包含请求头字段的字典。例如:content_type = self.headers.get('Content-Type')。
下面是一个使用 BaseHTTPRequestHandler 的简单示例,该示例处理了一个 GET 请求并返回一个 HTML 页面:
from http.server import BaseHTTPRequestHandler, HTTPServer
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
# 设置响应状态码和响应头
self.send_response(200, 'OK')
self.send_header('Content-type', 'text/html')
self.end_headers()
# 发送响应内容
self.wfile.write(b'<html><body><h1>Hello, World!</h1></body></html>')
if __name__ == '__main__':
server_address = ('', 8000)
httpd = HTTPServer(server_address, MyHandler)
httpd.serve_forever()
在上面的示例中,我们定义了一个名为 MyHandler 的类,继承自 BaseHTTPRequestHandler。在 do_GET() 函数中,我们设置了响应状态码和响应头,然后通过 self.wfile.write() 发送了一个简单的 HTML 页面作为响应内容。
运行这个示例程序,可以启动一个简单的 HTTP 服务器,监听本地的 8000 端口。当访问 http://localhost:8000 时,会收到一个包含 "Hello, World!" 的 HTML 页面作为响应。
