SOAP - Erste Schritte
Scope dieses Artikels ist nur die elementare Verwendung von SOAPpy
Zunächst benötigt man SOAPpy. In einem Debian-System braucht es dazu nur eines:
apt-get install python-soappy
Bei Sourceforge findet sich das Modul unter: http://sourceforge.net/projects/pywebsvcs
Sollte man mehrere Pythonversionen installiert haben, muss das Module (einschließlich des XML-Modules) ggf. noch in /site-packages
der vom Zope verwendeten Pythonversion umkopieren.
Damit später keine Encoding-Probleme auftreten, kann man in diesem Zusammenhang auch gleich eine sitecustomize.py
in /site-packages
hinterlegen
#sitecustomize.py
#-----------------------------------------------------------------------------
import sys
sys.setdefaultencoding('iso-8859-1')
Als nächstes braucht man einen SOAP-Provider (Server).
Hier ein einfaches Beispiel:
provider.py
#-----------------------------------------------------------------------------
from SOAPpy import Server
class math:
def __init__(self):
self.result = 0
def worker_reset(self,args):
self.result = 0
def worker_multiply(self,args):
temp = 1
for x in args:
temp = x*temp
self.result = temp + self.result
def worker_add(self,args):
temp = 0
for x in args:
temp = x+temp
self.result = temp + self.result
class strng:
def __init__(self):
self.result = ""
def worker_reset(self,args):
self.result = ""
def worker_reflect(self,args):
for x in args:
self.result = self.result + x
m = math()
s = strng()
def dispatch(obj="",func="",args=()):
klasses = {'math':m, 'string':s}
klass = klasses[obj]
function = getattr(klass,"worker_%s" % func)
function(args)
return klass.result
server = Server.SOAPServer(('localhost',8031))
server.registerFunction(dispatch)
server.serve_forever()
Der Server bietet eine Klasse mit Methoden zum Addieren und Multiplizieren und eine Klasse, die Strings zusammenzufügt und reflektiert. Interessant ist eigentlich nur die Funktion dispatch()
. Damit werden die Methoden aus den Klassen aufgerufen. Beispiel:
dispatch('math','multiply',(2,2,2))
dispatch('string','reflect','öäü')
Dieser Server soll zum Testen dienen, also lässt man ihn neben dem Zope laufen:
python provider.py
Jetzt ist nur noch ein Script als Client für den SOAP-Provider erforderlich:
client.py
#-----------------------------------------------------------------------------
# -*- coding: iso-8859-1 -*-
from SOAPpy import Client
server = Client.SOAPProxy("http://localhost:8031",encoding="iso-8859-1")
def soap(klass="",func="",args=()):
return server.dispatch(klass,func,args)
Die zweite Zeile ist ab Python2.3 interessant, damit wird das Encoding gesetzt (Siehe PEP 0263). Ansonsten ist der Client unspektakulär. Er stellt eine Funktion soap() zur Verfügung, die ihrerseits nur die Parameter an den Server weitergibt und das Ergebnis des Servers zurückgibt. Das Script wird einfach in /Extensions
kopiert.
Im Zope wird client.py
als Externe Methode eingebunden und dann etwa mit einem Python-Script mit den Parametern aufgerufen. Also:
Externe Methode client.py
Id soap
Title Soap
Module Name client
Function Name soap
Python-Script test_py
## Script (Python) "test_py"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
context.soap('math','reset',())
return context.soap('math','multiply',(2,2))