要在Python中实现一个简单的HTTP服务器,可以使用Python内置的库http.server,它是非常基础但足够演示基本HTTP服务的功能。
1. 导入必要的模块
首先,需要导入http.server
和socketserver
模块。http.server
提供了基础的HTTP服务器功能,而socketserver则是Python的网络通信库的一部分,它提供了基本的服务器和客户端类。
import http.server
import socketserver
2. 定义请求处理器
接下来,定义一个请求处理器,这个处理器会继承自http.server.SimpleHTTPRequestHandler
。SimpleHTTPRequestHandler
是一个简单的HTTP请求处理器,它能自动处理GET和HEAD请求,并能从当前目录或者子目录中读取文件。
在我们的示例中,我们覆盖了do_GET方法,这样可以自定义处理GET请求的行为。比如,当浏览器请求根路径(即/)时,我们将请求的路径修改为index.html,这样服务器就会返回index.html文件的内容。
class MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):def do_GET(self):if self.path == '/':self.path = 'index.html'return http.server.SimpleHTTPRequestHandler.do_GET(self)
3. 设置服务器和端口
在定义了请求处理器之后,需要设置服务器使用的端口,并创建一个服务器实例。在这个例子中,使用8000作为端口号。socketserver.TCPServer
类用来创建服务器,它接受一个元组(表示地址和端口)和一个请求处理器类作为参数。
PORT = 8000
with socketserver.TCPServer(("", PORT), MyHttpRequestHandler) as httpd:print("Serving at port", PORT)httpd.serve_forever()
4. 启动服务器
使用上面设置的端口和处理器启动服务器。这是通过调用serve_forever()
方法实现的,它会让服务器持续运行,直到被手动停止(例如,通过键盘中断)。
运行和访问
- 将以上所有代码保存为一个Python脚本(如server.py)。
- 确保工作目录有一个index.html文件。
- 通过命令行运行python server.py。
- 在浏览器中访问http://localhost:8000/,能看到index.html的内容。
扩展HTTP请求处理器以支持POST和PUT方法
import http.server
import socketserverPORT = 8000class MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):def do_GET(self):if self.path == '/':self.path = 'index.html'return http.server.SimpleHTTPRequestHandler.do_GET(self)def do_POST(self):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()response = "Received POST request:<br>{}".format(post_data.decode('utf-8'))self.wfile.write(response.encode('utf-8')) # 发送响应数据def do_PUT(self):content_length = int(self.headers['Content-Length'])put_data = self.rfile.read(content_length)self.send_response(200)self.send_header('Content-type', 'text/html')self.end_headers()response = "Received PUT request:<br>{}".format(put_data.decode('utf-8'))self.wfile.write(response.encode('utf-8'))