Ok. I followed the code through the internals. I created a separate controller derived from DecoratedController and updates the setup_routes() function. The routing works just fine and returns eventually my new controller. Then we get into the actuall object dispatch and it looks like the TG piece and the Pylons piece don't agree exactly on what's going on.
- In pylons/controllers/core.py the __call__() method of the WSGIController is called - The __call__() method calls _inspect_call() with the __before__ attribute, which is a function - The _inspect_call() method after a lot of arg checks and other stuff calls the _perform_call with the __before__ attribute - The _inspect_call() method is implemented by TG proper in tg.controllers.DecoratedController. This expects the passed in func object to have a 'decoration' attribute, but the __before__ function passed by Pylons have no such attribute, so we get AttributeError and everything blows up. Does it ring a bell? I can't figure out all the implicit assumptions and expectations in the code. I can't even tell if there is a bug or if I'm doing something wrong/missing some configuration step. Thanks, Carl On Mar 13, 11:50 am, Carl <[email protected]> wrote: > I'm using the latest TurboGears2 2.0b7 (according to paster tginfo). I > also did: > > easy_install -U -ihttp://www.turbogears.org/2.0/downloads/current/index > tg.devtools > > and it told me I already have the latest. I'll try routing to a > different controller. > > Thanks, Carl > > On Mar 13, 10:49 am, Mark Ramm <[email protected]> wrote: > > > I think there was a bug with __before__ and the decoration object > > that has been fixed in the last beta, what version of tg2 are you > > using (you can check with paster tginfo). > > > I have not tried making the RootController into a decorated > > controller, I'd try making a new controller and routing to that. I > > won't have time to make a doc this afternoon, but I can try to look at > > it tomorrow if you don't get it working before then. > > > --Mark > > > On Fri, Mar 13, 2009 at 1:01 PM, Carl <[email protected]> wrote: > > > > Mark, > > > Thanks for the quick response. It didn't work though. My > > > RootController now subclasses tg.controllers.DecoratedController and I > > > get the following error even onhttp://localhost:8080/(theroot): > > > > Module tg.controllers:125 in _perform_call > > >>> controller.decoration.run_hooks('before_validate', remainder, > > > AttributeError: 'function' object has no attribute 'decoration' > > > > The code expects 'controller' to be an object with a 'decoration' > > > attribute, but in my case the controller is the __before__ method of > > > RootController: > > > >>>> controller > > > <bound method RootController.__before__ of > > > <nine.controllers.root.RootController object at 0x99a3d0>> > > > > Is it possible to post a fully working TG2 custom routes example? It > > > doesn't even have to be the entire project just the differences from a > > > standard quickstarted project. > > > > Thanks, Carl > > > > On Mar 13, 7:40 am, Mark Ramm <[email protected]> wrote: > > >> Yea, those docs are missing some important details. > > > >> One think you do need to know is that the > > >> TGController/ObjectDispatchController expects to be routed to for > > >> object dispatch, not for a final page. > > > >> So you want to use DecoratedController when defining your own custom > > >> routes. > > > >> All of this should go on the RoutesIntegration page. > > > >> --Mark > > > >> On Fri, Mar 13, 2009 at 6:23 AM, Carl <[email protected]> wrote: > > > >> > Hi, > > >> > I'm trying to do custom routes with TG2 and failing so far. The > > >> > instructions > > >> > inhttp://turbogears.org/2.0/docs/main/RoutesIntegration.html > > >> > tell you to: > > > >> > "you can easily do that, just by providing your own function to set up > > >> > the routes map. You can update the routes defaults by overriding the > > >> > setup_routes method of the base_config object in app_cfg.py." > > > >> > Well, it's not that clear . setup routes() is a method of AppConfig. > > >> > If you just implement your own function in app_cfg.py it is never > > >> > called. You can subclass AppConfig and provide your own setup_routes() > > >> > method or you can create a custom setup_routes() function and assign > > >> > it to the original AppConfig before you instantiate base_config: > > > >> > AppConfig.setup_routes = custom_setup_routes > > >> > base_config = AppConfig() > > > >> > You will also need to import a bunch of stuff from tg.configuration > > >> > such as Mapper and config. > > > >> > Once, I got that part right and my custom_setup_routes function was > > >> > actually called, it just did,'t work. I can't even get a simple hard- > > >> > coded path to work. Here is my custom_setup_routes() function: > > > >> > def custom_setup_routes(self): > > >> > """Setup the default TG2 routes > > > >> > Override this and set up your own routes maps if you want to use > > >> > routes. > > >> > """ > > >> > #from dbgp.client import brk; brk(port=9011) > > >> > map = Mapper(directory=config['pylons.paths']['controllers'], > > >> > always_scan=config['debug']) > > > >> > map.connect('prefix/foo', controller='root', action='foo') > > > >> > # Setup a default route for the root of object dispatch > > >> > map.connect('*url', controller='root', > > >> > action='routes_placeholder') > > > >> > config['routes.map'] = map > > > >> > I expect that the /prefix/foo URL will result in a call to the foo() > > >> > method on my RootController, but it doesn't. The standard object > > >> > dospatch works just fine, so /foo does get to my foo() method. > > > >> > Can someone tell me what I'm doing wrong and/or explain how to debug > > >> > routing and/or show a full-fledged example of custom routes in TG2? > > > >> > Thanks, Carl > > > >> -- > > >> Mark Ramm-Christensen > > >> email: mark at compoundthinking dot com > > >> blog:www.compoundthinking.com/blog > > > -- > > Mark Ramm-Christensen > > email: mark at compoundthinking dot com > > blog:www.compoundthinking.com/blog --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "TurboGears" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/turbogears?hl=en -~----------~----~----~----~------~----~------~--~---

