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