Search code examples
pythoncherrypy

Running more than one class in Cherrypy


I'm trying to build a small site with an index etc. and an api that I want in /api.

For example:

class Site(object):
    @cherrypy.expose
    def index(self):
        return "Hello, World!"
    @cherrypy.expose
    def contact(self):
        return "Email us at..."
    @cherrypy.expose
    def about(self):
        return "We are..."

class Api(object):
    @cherrypy.expose
    def getSomething(self, something):
        db.get(something)
    @cherrypy.expose
    def putSomething(self, something)

So, I'd like to be able to go to mysite.com/contact and mysite.com/Api/putSomething

If I use cherrypy.quickstart(Site()), I'll only get the pages under Site.

I think there's a way of mapping the class Api under /Api, but I can't find it.


Solution

  • Update (13th March, 2017): The original answer below is quite outdated but am leaving it as it is to reflect the original question that was asked.

    The official documentation now has a proper guide on how to achieve it.


    Original Answer:

    Look at the default dispatcher. The entire documentation for Dispatching.

    Quoting from the docs:

    root = HelloWorld()
    root.onepage = OnePage()
    root.otherpage = OtherPage()
    

    In the example above, the URL http://localhost/onepage will point at the first object and the URL http://localhost/otherpage will point at the second one. As usual, this search is done automatically.

    This link gives even more detail on it with a complete example shown below.

    import cherrypy
    
    class Root:
        def index(self):
            return "Hello, world!"
        index.exposed = True
    
    class Admin:
        def user(self, name=""):
            return "You asked for user '%s'" % name
        user.exposed = True
    
    class Search:
        def index(self):
            return search_page()
        index.exposed = True
    
    cherrypy.root = Root()
    cherrypy.root.admin = Admin()
    cherrypy.root.admin.search = Search()