众所周知,像 CGI 那样分叉一个运行 Python 的进程比像 WSGI 那样嵌入 Python 要慢。我想使用标准 Python 库中包含的 SimpleXMLRPCServer 来实现 XML-RPC 接口,并且我已经有了一个可以通过 CGI 工作的实现。我相信应该有更快的方法。我想尝试 WSGI,但首先我需要一个 WSGI 的请求处理程序,而 SimpleXMLRPCServer 中似乎还没有一个请求处理程序。我是湿透了还是在 Python 2.6、2.7、3.x 下的标准库中没有类似的东西?
这是我对 CGIXMLRPCRequestHandler 的 WSGI 替代的初始实现:
from xmlrpclib import SimpleXMLRPCDispatcher
class WSGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):
"""Simple handler for XML-RPC data passed through WSGI."""
def __init__(self, allow_none = False, encoding = None):
SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
def __call__(self, environ, start_response):
"""Parse and handle a single XML-RPC request"""
result = []
method = environ['REQUEST_METHOD']
headers = [('Content-type', 'text/html')]
if method != 'POST':
# Default implementation indicates an error because XML-RPC uses the POST method.
code = 400
message, explain = BaseHTTPServer.BaseHTTPRequestHandler.responses[code]
status = '%d %s' % (code, message)
if method == 'HEAD':
response = ''
else:
response = BaseHTTPServer.DEFAULT_ERROR_MESSAGE % {'code' : code, 'message' : message, 'explain' : explain}
else:
# Dispatch XML-RPC to implementation
status = '200 OK'
request = environ['wsgi.input'].read(int(environ['CONTENT_LENGTH']))
response = self._marshaled_dispatch(request)
length = len(response)
if length > 0:
result = [response]
headers.append(('Content-length', str(length)))
start_response(status, headers)
return result