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

python3: 简易的 http 服务器 -ag真人游戏

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