Python – Dealing with dynamic urls

PHPpythonurl-routing

Let's say my main controller 'hotels' has a pattern for the url, such as:

/hotels/colorado/aspen/hotel-name/

How should I program my controller ( keep in mind I'm still learning MVC ) to handle this variable?

I know that I have to probably check if anything after /hotels/ is set, otherwise show the default hotels page.
If a state is set, show the state page, and so forth with the city and hotel name.

class hotelController {
    function state() {
    }

    function city() {
    }

    function hotel() {
    }
}

Should I have 3 separate methods for each of those? Any advice is appreciated.

Best Answer

Usually this is solved with Object Dispatch. You can also create nested Controllers to handle this. An advantage is, that you can follow a major OOP principle, namely encapsulation, as you group all functionality that only concerns Hotels generally in the Hotel controller (for example adding a new one)

Another advantage is, you dont have to check what is set after /hotels/ for example. It will only be dispatched to a new controller if there is something left to dispatch i.e. if the current controller wasnt able to handle the entire request.

This isnt really specific to a certain framework, but it is fully implemented in Pylons and Turbogears 2.0. (For more details you may refer to http://turbogears.org/2.0/docs/main/TGControllers.html#the-lookup-method )

class HotelController(Controller):
    """ Controller to handle requests to Hotels """

    def index(self):
        """ Handle the index page here """
        pass

    def addNewHotel(self):
        """ Register a new hotel here """
        pass

    def lookup(self, state_name, *remainder):
        """ Read the state, create a new StateController and dispatch """
        state_dispatch = StateController(state_name)
        return state_dispatch, remainder

class StateController(object):
    """ Controller used to dispatch """

    def __init__(self, state_name):
        # do your work on the state here
        pass

    def create(self, state_name):
        """ Create a new state here """

    def lookup(self, city_name, *remainder):
        """ keep on dispatching to other controllers """
        city_dispatch = CityController(city_name)
        return city_dispatch, remainder