BaseHttpServer与wsgiref.simple_server的区别

6 投票
1 回答
1291 浏览
提问于 2025-04-19 06:43

我在找一个模块,想要实现一个基本的HTTP服务器,方便本地访问。看起来Python的标准库里有两种方法可以实现简单的HTTP服务器:wsgiref.simple_serverBaseHttpServer

这两者有什么区别呢?有没有特别的理由让我更倾向于使用其中一个?

1 个回答

10

简短回答: wsgiref.simple_server 是一个基于 BaseHTTPServer 的 WSGI 适配器。

详细回答:

BaseHTTPServer(以及它所依赖的 SocketServer)是实现大部分实际 HTTP 服务器功能的模块。它可以接收请求并返回响应,但它需要知道如何处理这些请求。当你直接使用 BaseHTTPServer 时,你需要通过继承 BaseHTTPRequestHandler 来提供处理程序,比如:

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

class MyHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-Type', 'text/plain')
        self.end_headers()
        self.wfile.write('Hello world!\n')

HTTPServer(('', 8000), MyHandler).serve_forever()

wsgiref.simple_server 将这个 BaseHTTPServer 接口适配成 WSGI 规范,这是一种与服务器无关的 Python 网络应用的标准。在 WSGI 中,你以函数的形式提供处理程序,比如:

from wsgiref.simple_server import make_server

def my_app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    yield 'Hello world!\n'

make_server('', 8000, my_app).serve_forever()

make_server 函数返回一个 WSGIServer 的实例,它从 BaseHTTPServer.HTTPServerSocketServer.TCPServer 继承了大部分实际的协议/网络逻辑(虽然它确实重新实现了一些简单的 HTTP 规则)。主要的区别在于你如何将应用程序代码与这些逻辑结合起来。

这实际上取决于你想解决的问题,但使用 wsgiref 编码可能是个更好的主意,因为这样将来你可以更容易地迁移到其他生产级的 HTTP 服务器,比如 uWSGIGunicorn

撰写回答