The point is the other controllers are not available without the controllers variable. I can provide the real domains used in a private conversation if helpful.
Since Bruno has also experienced this it must be a real problem. On Fri, Nov 18, 2011 at 2:09 AM, Jonathan Lundell <jlund...@pobox.com> wrote: > On Nov 17, 2011, at 8:48 AM, Richard Baron Penman wrote: > >> OK domain1/sales >> (These are just examples - if would be helpful to have the exact >> settings and domains I am using we can have a private conversation.) >> >> The apps have different controllers. > > With this router: > > routers = dict( > BASE = dict( > domains = { > 'domain1' : 'forum', > 'domain2' : 'sales', > }, > ), > ) > > The logic for domain1/sales says this: It's domain1, so the app must be > 'forum'. (If you've specified 'domains=', the router takes that to be > authoritative.) > > There's no forum/sales controller, so sales must be a function in the default > controller of forum: forum/default/sales. > > Which app/controller/function do you expect domain1/sales to resolve to? > >> >> Richard >> >> >> On Fri, Nov 18, 2011 at 1:31 AM, Jonathan Lundell <jlund...@pobox.com> wrote: >>> On Nov 17, 2011, at 8:20 AM, Richard Baron Penman wrote: >>> >>>> in fact Bruno's suggestion to use the controllers variable does work for >>>> me. >>>> Previously I used what you suggest (see first post in this thread) and >>>> then only the default controller was exposed. >>>> >>>> What error? Accessing domain/sales before returned this error: >>>> invalid function (default/sales) >>> >>> domain/sales? Not domain1 or domain2? >>> >>> Do your two apps have exactly the same list of controllers? >>> >>>> >>>> Richard >>>> >>>> >>>> On Fri, Nov 18, 2011 at 12:24 AM, Jonathan Lundell <jlund...@pobox.com> >>>> wrote: >>>>> On Nov 16, 2011, at 11:53 PM, Richard Baron Penman wrote: >>>>> >>>>>> what web2py version are you using? I have 1.99.2 >>>>>> >>>>>> >>>>>> This is the only variable I have defined in routes.py: >>>>>> >>>>>> routers = dict( >>>>>> BASE = dict( >>>>>> domains = { >>>>>> 'domain1' : 'forum', >>>>>> 'domain2' : 'sales', >>>>>> }, >>>>>> >>>>>> controllers = ['default', 'appadmin', 'view'], # also tried >>>>>> 'ALL' but did not work >>>>>> ), >>>>>> ) >>>>> >>>>> Defining controllers= in the BASE router won't work. I'd expect this to >>>>> work: >>>>> >>>>> routers = dict( >>>>> BASE = dict( >>>>> domains = { >>>>> 'domain1' : 'forum', >>>>> 'domain2' : 'sales', >>>>> }, >>>>> ), >>>>> ) >>>>> >>>>> With that router, what breaks, exactly? What incoming URL and what error >>>>> message? >>>>> >>>>>> >>>>>> >>>>>> On Thu, Nov 17, 2011 at 12:56 AM, Jonathan Lundell <jlund...@pobox.com> >>>>>> wrote: >>>>>>> On Nov 16, 2011, at 5:32 AM, Richard Baron Penman wrote: >>>>>>> >>>>>>>> I found listing the controllers explicitly as Bruno mentioned fixed >>>>>>>> the problem. >>>>>>>> Previously domain/non-default-controller returned: invalid function >>>>>>>> (default/non-default-controller) >>>>>>>> I would expect all controllers to work by default. >>>>>>> >>>>>>> I wrote a unit test that isn't seeing a problem. Would you please >>>>>>> suggest an input URL that would cause the problem? >>>>>>> >>>>>>> Thanks. >>>>>>> >>>>>>> >>>>>>> def test_router_domains_fs(self): >>>>>>> ''' >>>>>>> Test URLs that map domains using test filesystem layout >>>>>>> ''' >>>>>>> routers = dict( >>>>>>> BASE = dict( >>>>>>> domains = { >>>>>>> "domain1.com" : "admin", >>>>>>> "domain2.com" : "welcome", >>>>>>> }, >>>>>>> ), >>>>>>> ) >>>>>>> >>>>>>> load(rdict=routers) >>>>>>> self.assertEqual(filter_url('http://domain1.com'), >>>>>>> '/admin/default/index') >>>>>>> self.assertEqual(filter_url('http://domain2.com'), >>>>>>> '/welcome/default/index') >>>>>>> self.assertEqual(filter_url('http://domain1.com/gae'), >>>>>>> '/admin/gae/index') >>>>>>> self.assertEqual(filter_url('http://domain2.com/other'), >>>>>>> '/welcome/other/index') >>>>>>> self.assertEqual(filter_url('http://domain1.com/gae/f1'), >>>>>>> '/admin/gae/f1') >>>>>>> self.assertEqual(filter_url('http://domain2.com/f2'), >>>>>>> '/welcome/default/f2') >>>>>>> self.assertEqual(filter_url('http://domain2.com/other/f3'), >>>>>>> '/welcome/other/f3') >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>>> >>>>>>>> Richard >>>>>>>> >>>>>>>> >>>>>>>> On Wed, Nov 16, 2011 at 2:36 PM, Jonathan Lundell <jlund...@pobox.com> >>>>>>>> wrote: >>>>>>>>> On Nov 15, 2011, at 8:54 PM, Bruno Rocha wrote: >>>>>>>>> >>>>>>>>>> On Wed, Nov 16, 2011 at 2:34 AM, Massimo Di Pierro >>>>>>>>>> <massimo.dipie...@gmail.com> wrote: >>>>>>>>>> this should not be the case. if it is is a bug. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> I found this some time ago and I tough it was the default behaviour. >>>>>>>>>> >>>>>>>>>> for the following worked >>>>>>>>>> >>>>>>>>>> routers = dict( >>>>>>>>>> BASE = dict( >>>>>>>>>> domains = { >>>>>>>>>> >>>>>>>>>> 'domain1.com' : 'app1', >>>>>>>>>> >>>>>>>>>> 'domain2.com' : 'app2', >>>>>>>>>> >>>>>>>>>> }, >>>>>>>>>> controllers=['default', 'appadmin', ..., ..., ..., ] >>>>>>>>>> ), >>>>>>>>>> ) >>>>>>>>>> >>>>>>>>>> I has to list every controller, also functions >>>>>>>>>> >>>>>>>>> >>>>>>>>> It shouldn't be necessary to list the controllers (and it's not a >>>>>>>>> good idea to list controllers explicitly in the BASE router; if you >>>>>>>>> need a controller list, put it in an app-specific section). >>>>>>> >>>>>>> >>>>>>> >>>>> >>>>> >>>>> >>> >>> >>> > > >