1

众所周知,像 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
4

1 回答 1

1

看看 这个希望它会有所帮助。

于 2012-12-18T03:36:09.587 回答