Python实现HTTP服务器

要在Python中实现一个简单的HTTP服务器,可以使用Python内置的库http.server,它是非常基础但足够演示基本HTTP服务的功能。

1. 导入必要的模块

首先,需要导入http.serversocketserver模块。http.server提供了基础的HTTP服务器功能,而socketserver则是Python的网络通信库的一部分,它提供了基本的服务器和客户端类。

import http.server
import socketserver

2. 定义请求处理器

接下来,定义一个请求处理器,这个处理器会继承自http.server.SimpleHTTPRequestHandlerSimpleHTTPRequestHandler是一个简单的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 socketserver

PORT = 8000

class 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'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值