1
很好理解的是,像CGI那樣分派運行Python的進程比嵌入Python慢,就像WSGI一樣。我想使用包含在標準Python庫中的SimpleXMLRPCServer來實現一個XML-RPC接口,並且我已經有一個通過CGI工作的實現。我相信應該有一個更快的方法。我想嘗試WSGI,但首先我需要一個WSGI的請求處理程序,並且在SimpleXMLRPCServer中似乎沒有一個。我是否全部弄溼了,還是在Python 2.6,2.7,3.x下的標準庫中沒有這種功能?CGIXMLRPCRequestHandler的WSGI替代品?
這裏是我的初步實施WSGI替代CGIXMLRPCRequestHandler的:
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