我正在寻找一个模块,它为我提供了本地访问的基本http服务器功能。看起来Python有两种方法可以在标准库中实现简单的http服务器:wsgiref.simple_server和BaseHttpServer。BaseHttpServer和wsgiref.simple_server之间的差异
有什么区别?是否有强烈的理由相对于另一方偏好?
我正在寻找一个模块,它为我提供了本地访问的基本http服务器功能。看起来Python有两种方法可以在标准库中实现简单的http服务器:wsgiref.simple_server和BaseHttpServer。BaseHttpServer和wsgiref.simple_server之间的差异
有什么区别?是否有强烈的理由相对于另一方偏好?
简短回答: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.HTTPServer
和SocketServer.TCPServer
的实际协议/网络逻辑的(尽管它最终会重新实现一些简单的HTTP规则)。主要不同之处在于您将应用程序代码与该逻辑集成的方式。
这真的取决于你试图解决的问题,但对编码是wsgiref
可能是一个更好的主意,因为它会很容易让你移动到不同的生产级的HTTP服务器,如uWSGI或Gunicorn,未来。