|
XmlRpcAndSimpleDatabaseExample
One-sentence summary of this page.
IntroductionThis is an example of a simple Twisted application that exposes a service through XML-RPC that does lookups in SimpleDB. It also shows how to use the command line tools to control SimpleDB. Populating the test domain with dataUsing the command line tools that come with this package we can easily setup and populate a domain with some test data. export AWS_KEY=YOURKEY export AWS_SECRET=YOURSECRET sdb-create-domain CanadianProvinces sdb-put-attributes CanadianProvinces ON name=Ontario code=ON capital=Toronto population=12753702 sdb-put-attributes CanadianProvinces QC name=Quebec code=QC capital=Quebec\ City population=7687068 sdb-put-attributes CanadianProvinces NS name=Novia\ Scotia code=NS capital=Halifax population=932966 sdb-put-attributes CanadianProvinces NB name=New\ Brunswick code=NB capital=Fredericton population=748878 sdb-put-attributes CanadianProvinces MB name=Manitoba code=MB capital=Winnipeg population=1182921 sdb-put-attributes CanadianProvinces BC name=British\ Columbia code=BC capital=Victoria population=4352798 sdb-put-attributes CanadianProvinces PE name=Prince\ Edward\ Island code=PE capital=Charlottetown population=138800 sdb-put-attributes CanadianProvinces SK name=Saskatchewan code=SK capital=Regina population=990212 sdb-put-attributes CanadianProvinces AB name=Alberta code=AB capital=Edmonton population=3455062 sdb-put-attributes CanadianProvinces NL name=Newfoundland\ and\ Labrador code=NL capital=St.\ John\'s population=506548 (Source is Wikipedia - Provinces and territories of Canada) If you now do an empty query on the domain, it should show all items: % sdb-fetch CanadianProvinces ''
QC: {'code': 'QC', 'capital': 'Quebec City', 'name': 'Quebec', 'population': '7687068'}
AB: {'code': 'AB', 'capital': 'Edmonton', 'name': 'Alberta', 'population': '3455062'}
SK: {'code': 'SK', 'capital': 'Regina', 'name': 'Saskatchewan', 'population': '990212'}
NL: {'code': 'NL', 'capital': "St. John's", 'name': 'Newfoundland and Labrador', 'population': '506548'}
BC: {'code': 'BC', 'capital': 'Victoria', 'name': 'British Columbia', 'population': '4352798'}
MB: {'code': 'MB', 'capital': 'Winnipeg', 'name': 'Manitoba', 'population': '1182921'}
ON: {'code': 'ON', 'capital': 'Toronto', 'name': 'Ontario', 'population': '12753702'}
NB: {'code': 'NB', 'capital': 'Fredericton', 'name': 'New Brunswick', 'population': '748878'}
NS: {'code': 'NS', 'capital': 'Halifax', 'name': 'Novia Scotia', 'population': '932966'}
PE: {'code': 'PE', 'capital': 'Charlottetown', 'name': 'Prince Edward Island', 'population': '138800'}
Total box usage: 0.0001076020Server CodeThis is the code for the XML-RPC server. Save it to provinces.py. #!/usr/bin/env python2.5
import os
from twisted.web import xmlrpc
from twisted.internet import defer
from polarrose.amazon.sdb import SimpleDatabaseService
class ProvinceService(xmlrpc.XMLRPC):
sdb = SimpleDatabaseService(key = os.environ.get("AWS_KEY"), secret = os.environ.get("AWS_SECRET"))
def xmlrpc_getProvinceByCapital(self, capital):
def handleSuccess(response):
if response.success and len(response.items) == 1:
print response.items[0].attributes
return response.items[0].attributes
else:
return {}
def handleFailure(failure):
return -1
deferred = self.sdb.fetch("CanadianProvinces", "['capital' = '%s']" % capital)
return deferred.addCallbacks(handleSuccess, handleFailure)
if __name__ == '__main__':
from twisted.internet import reactor
from twisted.web import server
reactor.listenTCP(8080, server.Site(ProvinceService()))
reactor.run()TestingTesting the service is easy. First we start it up: export AWS_KEY=YOURKEY export AWS_SECRET=YOURSECRET ./provinces.py Then from an interactive Python session we can make calls: % python
Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.>>> import xmlrpclib
>>> server = xmlrpclib.Server('http://127.0.0.1:8080/')
>>> server.getProvinceByCapital('Toronto')
{'population': '12753702', 'code': 'ON', 'name': 'Ontario', 'capital': 'Toronto'}
|
Sign in to add a comment