|
Michael
mogmios at mlug.missouri.edu
Sat Mar 6 03:23:07 EST 2004
This is my first stab at an XML-RPC handler for mod_python. I haven't
really used mod_python before this so I thought maybe somee of you could
take a peek and give me advice on if I'm doing things horribly wrong or
not. Obviously I borrowed this mostly from Python's own
CGIXMLRPCRequestHandler but with the needed changes to work with
mod_python and to provide some documentation to visitors. Thanks.
----
from mod_python import apache
from mod_python import util
import SimpleXMLRPCServer
class MPXMLRPCRequestHandler ( SimpleXMLRPCServer.SimpleXMLRPCDispatcher ):
"""Simple handler for XML-RPC data passed through mod_python."""
def __init__ ( self ):
SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__ ( self )
def handle_xmlrpc ( self, req ):
"""Handle a single XML-RPC request or a request for
documentation."""
if req.method == 'POST':
response = self._marshaled_dispatch ( req.read () )
req.content_type = "text/xml"
req.send_http_header ()
req.write ( response )
elif req.method == 'GET':
path = 'http://%s:%s%s' % ( req.server.server_hostname,
req.server.port, req.parsed_uri[apache.URI_PATH] )
req.content_type = "text/html"
req.send_http_header ()
FS = util.FieldStorage ( req )
docs = ''
if FS.has_key ( 'topic' ):
docs += '<a href="%s">back to topic
list</a><h1>%s</h1>' % ( path, FS['topic'] )
docs += self.system_methodHelp ( FS['topic'] )
else:
methods = self.system_listMethods ()
if methods:
for method in methods:
docs += '<li><a
href="%s?topic=%s">%s</a></li>' % ( path, method, method )
req.write (
'<html><head><title>Documentation</title></head><body>%s</body></html>'
% ( docs ) )
def test ( i ):
"""These are my test docs."""
return i, i * 2
xmlrpc = MPXMLRPCRequestHandler ()
xmlrpc.register_function ( test )
xmlrpc.register_introspection_functions ()
def handler ( req ):
global xmlrpc
xmlrpc.handle_xmlrpc ( req )
return apache.OK
----
|