菜鸟笔记
提升您的技术认知

Python3: 简易的 HTTP 服务器 - http.server

Python 官方文档: http.server — HTTP 服务器

http.server模块实现了一个简单的 HTTP 服务器(Web服务器)。

http.server模块中主要涉及的几个类:

# HTTP 服务器, 主线程中处理请求
class http.server.HTTPServer(server_address, RequestHandlerClass)

# HTTP 服务器, 子线程中处理请求
class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)

# HTTP 请求处理器(请求到来时由 HTTPServer 实例化)
class http.server.BaseHTTPRequestHandler(request, client_address, server)

# 简单的 HTTP 请求处理器, 同直接运行命令: python3 -m http.server
class http.server.SimpleHTTPRequestHandler(request, client_address, server, directory=None)

简单 HTTP 服务器实现:

import http.server


class RequestHandlerImpl(http.server.BaseHTTPRequestHandler):
    """
    自定义一个 HTTP 请求处理器
    """
    
    def do_GET(self):
        """
        处理 GET 请求, 处理其他请求需实现对应的 do_XXX() 方法
        """
        # print(self.server)                # HTTPServer 实例
        # print(self.client_address)        # 客户端地址和端口: (host, port)
        # print(self.requestline)           # 请求行, 例如: "GET / HTTP/1.1"
        # print(self.command)               # 请求方法, "GET"/"POST"等
        # print(self.path)                  # 请求路径, Host 后面部分
        # print(self.headers)               # 请求头, 通过 headers["header_name"] 获取值
        # self.rfile                        # 请求输入流
        # self.wfile                        # 响应输出流

        # 1. 发送响应code
        self.send_response(200)

        # 2. 发送响应头
        self.send_header("Content-Type", "text/html; charset=utf-8")
        self.end_headers()

        # 3. 发送响应内容(此处流不需要关闭)
        self.wfile.write("Hello World\n".encode("utf-8"))

    def do_POST(self):
        """
        处理 POST 请求
        """
        # 0. 获取请求Body中的内容(需要指定读取长度, 不指定会阻塞)
        req_body = self.rfile.read(int(self.headers["Content-Length"])).decode()
        print("req_body: " + req_body)

        # 1. 发送响应code
        self.send_response(200)

        # 2. 发送响应头
        self.send_header("Content-Type", "text/html; charset=utf-8")
        self.end_headers()

        # 3. 发送响应内容(此处流不需要关闭)
        self.wfile.write(("Hello World: " + req_body + "\n").encode("utf-8"))


# 服务器绑定的地址和端口
server_address = ("", 8000)

# 创建一个 HTTP 服务器(Web服务器), 指定绑定的地址/端口 和 请求处理器
httpd = http.server.HTTPServer(server_address, RequestHandlerImpl)

# 循环等待客户端请求
httpd.serve_forever()

# 本地浏览器访问:      http://localhost:8000
# curl命令 GET 访问:  curl http://localhost:8000/hello/world
# curl命令 POST 访问: curl http://localhost:8000/hello/world -d "name=tom&age=25"

SimpleHTTPRequestHandler请求处理器:

import http.server

server_address = ("", 8000)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.serve_forever()

# 上面代码同直接运行命令: python3 -m http.server 8000

# 本地浏览器访问: http://localhost:8000