欢迎访问宙启技术站
智能推送

在Python中使用HTTPServer()模块处理HTTP请求

发布时间:2024-01-11 14:40:14

在Python中,可以使用内置的http.server模块中的HTTPServer类来创建一个简单的HTTP服务器,用于处理HTTP请求。HTTPServer类继承自socketserver.TCPServer类,它使用TCP协议来与客户端通信,接收并处理HTTP请求。

以下是一个使用HTTPServer模块处理HTTP请求的示例:

from http.server import HTTPServer, BaseHTTPRequestHandler


class MyRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # 处理GET请求
        if self.path == '/':
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            self.wfile.write(b'Hello, World!')
        else:
            self.send_response(404)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            self.wfile.write(b'NOT FOUND')

    def do_POST(self):
        # 处理POST请求
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)

        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(b'POST received: ' + post_data)


def run_server():
    host = 'localhost'
    port = 8000

    server = HTTPServer((host, port), MyRequestHandler)
    print(f'Server running on {host}:{port}')

    server.serve_forever()


if __name__ == '__main__':
    run_server()

在这个示例中,我们首先定义了一个自定义的请求处理类MyRequestHandler,它继承自BaseHTTPRequestHandler类。在这个自定义类中,我们覆写了do_GETdo_POST方法来处理GET和POST请求。

do_GET方法中,我们根据请求路径的不同返回不同的响应。如果路径为根路径'/',则返回200状态码和文本内容'Hello, World!';否则返回404状态码和文本内容'NOT FOUND'。

do_POST方法中,我们首先根据请求头中的Content-Length获取POST请求的数据长度,然后使用self.rfile.read方法读取POST请求的数据。然后返回200状态码和文本内容'POST received: ' + post_data。

接下来,我们定义了一个run_server函数,用于启动HTTP服务器。在该函数中,我们指定服务器的主机地址和端口号,并创建一个HTTPServer对象,将主机地址和端口号以及请求处理类传递给构造函数。最后,我们调用serve_forever方法,使服务器一直运行,处理客户端的请求。

最后,我们在if __name__ == '__main__':的条件中调用run_server函数来启动HTTP服务器。

要使用该示例,只需运行上述代码,然后可以在浏览器中访问http://localhost:8000来测试GET请求,或使用curl命令进行POST请求测试:

curl -X POST -d "test_data" http://localhost:8000

这是一个简单的使用HTTPServer模块处理HTTP请求的示例,你可以根据自己的需求进行修改和扩展。