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クライアントヘルパー もよろしく。