On Jul 28, 2011, at 9:30 AM, Wikus van de Merwe wrote:

> I want to use app-specific routes to make my application more portable. Let's 
> assume that there
> is no "web2py/routes.py" file and my application name is "init". Now I 
> created the "routes.py" file
> in "web2py/applications/init/" directory and defined my simple router there:
> 
> my_router = dict(
>   controllers = "DEFAULT",
>   functions = ["about", "privacy", "api"],
>   map_static = True,
> )
> 
> My intention here was to make some URLs shorter:
> /init/default/about <-> /about 
> /init/static/css/print.css <-> /static/css/print.css
> 
> After reading the code of rewrite.py:load() I got an impression that I need 
> to define this app-specific
> router inside a "routers" dictionary. It doesn't make much sense for me, but 
> so be it, I added:
> 
> routers = {"init":my_router}
> 
> However this doesn't work for the app-specific routes in 
> "web2py/applications/init/routes.py".
> On the other hand, it works when put in "web2py/routes.py" so I believe I 
> didn't define the
> router correctly.
> 
> As this is not documented precisely and the welcome or example apps have no 
> app-level routes
> defined either could you please share some more information/examples on this? 
> I've tried to figure
> out the mechanism from the code but the routes loading procedure is not the 
> easiest one to follow :)

You need to have at least a base router defined in web2py/routes.py in order to 
find the one in your application's directory. The one in the example file 
should suffice (with the default app set to init or omitted):

routers = dict(

    # base router
    BASE = dict(
        default_application = 'welcome',
    ),
)

It's the presence of a non-empty routers dict in the base routes.py that 
enables the logic.

Personally, I'm of the view that it makes sense to put your app-specific 
routers in the base routes.py routers dictionary, but that's up to you.

Reply via email to