BaseHttpServer和wsgiref.simple_server之间的差异

时间:2014-09-01 20:01:24

标签: python basehttpserver wsgiref

我正在寻找一个为我提供本地访问的基本http服务器功能的模块。看起来Python有两种方法可以在标准库中实现简单的http服务器:wsgiref.simple_serverBaseHttpServer

有什么区别?是否有任何理由更喜欢一个而不是另一个?

1 个答案:

答案 0 :(得分:8)

简答: wsgiref.simple_serverBaseHTTPServer上的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 Web应用程序的标准。在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,将来。