CherryPy

../../_images/cherrypy-logo.jpg

Introduction

CherryPy 3.0+ allows you to graft any WSGI application as a controller. PyAMF’s WSGI gateway can thus be used to easily expose a set of methods via AMF remoting.

Example

Server

The following example shows how a single method is exposed in this way. Create a file called server.py with the following content:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import logging

import cherrypy

from pyamf.remoting.gateway.wsgi import WSGIGateway

	
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s %(levelname)-5.5s [%(name)s] %(message)s'
)


def echo(data):
   """
   This is a function that we will expose.
   """
   return data


class Root(object):
    """
    This is the root controller for the rest of the website.
    """
    def index(self):
        return "This is your main website"
    index.exposed = True


config = {
    '/crossdomain.xml': {
        'tools.staticfile.on': True,
        'tools.staticfile.filename': '/path/to/crossdomain.xml'
    }
}

services = {
   'myservice.echo': echo,
   # Add other exposed functions here
}

gateway = WSGIGateway(services, logger=logging, debug=True)

# This is where we hook in the WSGIGateway
cherrypy.tree.graft(gateway, "/gateway/")
cherrypy.quickstart(Root(), config=config)

You can easily expose more functions by adding them to the dictionary given to WSGIGateway. You can also create a totally different controller and expose it under another gateway URL.

Here is a suitable crossdomain.xml file:

1
2
3
4
5
6
7
8
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">

<cross-domain-policy>
	<site-control permitted-cross-domain-policies="all"/>
	<allow-access-from domain="*" secure="false"/>
	<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>

Now run the script to start the web server.

Client

To test the gateway you can use a Python AMF client like this:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import logging

from pyamf.remoting.client import RemotingService

	
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s %(levelname)-5.5s [%(name)s] %(message)s'
)


path = 'http://localhost:8080/gateway/'
gw = RemotingService(path, logger=logging, debug=True)
service = gw.getService('myservice')

print service.echo('Hello World!')

Table Of Contents

Previous topic

SQLAlchemy

Next topic

TurboGears

This Page