我正在寻找一个为我提供基本 http 服务器功能以进行本地访问的模块。似乎 Python 有两种方法可以在标准库中实现简单的 http 服务器:wsgiref.simple_server和BaseHttpServer。
有什么区别?有什么强有力的理由更喜欢其中一个吗?
我正在寻找一个为我提供基本 http 服务器功能以进行本地访问的模块。似乎 Python 有两种方法可以在标准库中实现简单的 http 服务器:wsgiref.simple_server和BaseHttpServer。
有什么区别?有什么强有力的理由更喜欢其中一个吗?
简短的回答: wsgiref.simple_server
是一个 WSGI 适配器BaseHTTPServer
。
更长的答案:
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
函数返回一个 的实例,它从andWSGIServer
继承了大部分实际的协议/网络逻辑(尽管它最终确实重新实现了一些简单的 HTTP 规则)。主要区别在于您将应用程序代码与该逻辑集成的方式。BaseHTTPServer.HTTPServer
SocketServer.TCPServer
这实际上取决于您要解决的问题,但编码wsgiref
可能是一个更好的主意,因为它可以让您在未来轻松迁移到不同的生产级 HTTP 服务器,例如uWSGI或Gunicorn .