XML-RPCサーバーのWSGI版

XML-RPCサーバーをお手軽に

tags:python, web, tips
created:2008-04-15T04:18:44

WSGIでXML-RPCサーバーを作成してみました。

WSGIでXML-RPCサーバーを作成してみました。

概要

WSGIベースでXML-RPCアプリを実装しました。 これで、WSGIミドルウェアを導入したりしたXML-RPCサーバーの構築が容易になります。

ソースコード

wsgixmlrpc.py
#!/usr/local/bin/python
# -*- encoding: utf-8 -*-

import SimpleXMLRPCServer
import BaseHTTPServer

class WSGIXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
  def __init__(self, allow_none=True, encoding=None):
    SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)

  def handle_xmlrpc(self, environ, start_response):
    request_text = environ['wsgi.input'].read(int(environ['CONTENT_LENGTH']))
    response = self._marshaled_dispatch(request_text)
    start_response('200 OK', [('Content-Type', 'text/xml')])
    return response

  def handle_get(self, environ, start_response):
    code = 400
    message, explain = \
             BaseHTTPServer.BaseHTTPRequestHandler.responses[code]
    response = BaseHTTPServer.DEFAULT_ERROR_MESSAGE % {
      'code' : code,
      'message' : message,
      'explain' : explain}
    start_response('%d %s' % (code, message), [('Content-Type', 'text/html')])
    return response

  def __call__(self, environ, start_response):
    if environ.get('REQUEST_METHOD', None)=='GET':
      return self.handle_get(environ, start_response)
    else:
      return self.handle_xmlrpc(environ, start_response)

"""Usage:
app = WSGIXMLRPCServer()
app.register_function(pow)
app.register_function(lambda x,y: x+y, 'add')
app.register_introspection_functions()
app.register_instance(MyFuncs())
res = app(environ, start_response)
"""

if __name__=='__main__':
  from wsgiref.handlers import CGIHandler
  app = WSGIXMLRPCServer()
  app.register_function(lambda x,y: x+y, 'add')
  app.register_introspection_functions()
  CGIHandler().run(app)

使い方

例えば、 WSGIでダイジェスト認証 での「wsgiauth」モジュールを利用して、 「ダイジェスト認証が必要なXML-RPCサーバーをCGI経由で」 動作させるには以下のように記述します。

import wsgiauth
import wsgixmlrpc
from wsgiref.handlers import CGIHandler
app = wsgixmlrpc.WSGIXMLRPCServer()
app.register_instance(あなたの定義したサーバークラス())
app.register_introspection_functions()
app.register_multicall_functions()
app = wsgiauth.DigestAuthMiddleware(app)
CGIHandler().run(app)

wsgiref内蔵サーバーで動作させたり、cherrypy、django、pylonsなどでも動作可能なはず。

まとめ

最近WSGIが面白くていろいろ実験してます。

このXML-RPCサーバーアプリ、WSGIサポートサーバーで動作可能になっていますので、 Google App Engine などでも使えるはずですよ~

XML-RPCクライアントヘルパー もよろしく。