My favorites | Sign in
Project Logo
             
Search
for
Updated Mar 08, 2008 by stefan.arentz
XmlRpcAndSimpleDatabaseExample  
One-sentence summary of this page.

Introduction

This 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 data

Using 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.0001076020

Server Code

This 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()

Testing

Testing 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
Hosted by Google Code