[Zope-dev] further how-to remarks on XMLRPCMethod

Phillip J. Eby pje@telecommunity.com
Wed, 27 Oct 1999 12:03:49 -0500


At 02:10 AM 10/28/99 +1000, Ben Leslie wrote:
>
>Below is a snippet of code which is the closet I've come to getting this
>to work. Unfortunately this totally kills and persistance
>
>
>    def __getattr__(self, name):
>        if name in ('ages', 'add', 'multiply'):
>                myserv = xmlrpclib.Server(self.server)
>                return (getattr(myserv,name))
>        else:
>                return Acquisition.Acquired

By the way, just as a postscript to my explanation of how to do this with
__of__, keep in mind that just because an object is persistent doesn't mean
it can't have non-persistent sub-objects...  for example:

class RPCMethodCollection:
	def __init__(self,server,allowed_names):
		self.server = server
		self.

	def __getattr__(self,name):
		if name in self.allowed_names:
			myserv = xmlrpclib.Server(self.server)
			return (getattr(myserv,name))
		raise AttributeError,name

Then have XMLRPCClient add a "methods" attribute that is an instance of
RPCMethodCollection.  You can now say things like:

<!--#with "someserver.methods"-->
<!--#call "add(2,3)"-->
<!--#/with-->

Which leads to my final point, namely that maybe, instead of making the
client object provide all the methods, maybe from a design perspective it
would make more sense to have very lightweight "XMLRPCMethod" objects which
talk to an "XMLRPCServer" object.  This allows you to have much more
fine-grained permissions control on use of the methods, and it'll be easier
to call them from DTML anyhow.