CGI のように Python を実行するプロセスを fork するのは、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