Oops, I thought this was fixed because of Gustavo's message, but it
seems that it wasn't -- so I'm committing a fix to the 2.0 branch
tonight.
Basically the fix is to do this:
#Special case __before__ and __after__ so don't need to be
@exposed
if controller.__name__ in ['__before__', '__after__']:
return controller(*remainder, **dict(params))
inside of _perform_call so that __before__ and __after__ don't need
decoration attributes since they really are special methods that you
want called on every request.
I'd very much apriciate it if someone could verify that routes work
from the hg.turbogears.org repo. The whole routing sytem is different
here, but I think we'll need to apply the same fix there. I think
this is a missing test that we ought to add, since using routes is
something we want to encourage.
--Mark Ramm
On Mar 18, 7:29 pm, Carl <[email protected]> wrote:
> Correction :-(. It doesn't really work. The Pylons request object
> doesn't have a response_type attribute. This line in the controller
> method raises AttributeError for 'response_type'
>
> if pylons.request.response_type == 'application/json':
> ...
>
> I'll leave it to the experts to figure it out. Please do.
>
> Hjhj
>
> Danke schein, Carl
>
> On Mar 18, 11:12 am, Carl <[email protected]> wrote:
>
> > I found a workaround, but it's not pretty. The solution is to override
> > the _perform_call() method of DecoratedController in your controller:
>
> > def _perform_call(self, controller, params, remainder=None):
> > # If not a decorated method just call it (needed for
> > __before__ and __after__)
> > if not hasattr(controller, 'decoration'):
> > if remainder is None:
> > remainder = []
>
> > return controller(*remainder, **dict(params))
> > return DecoratedController._perform_call(self, controller,
> > params, remainder)
>
> > Carl
>
> > On Mar 17, 1:59 am, Raphael Slinckx <[email protected]> wrote:
>
> > > See also this post from me from a while
> > > ago:http://groups.google.com/group/turbogears/browse_thread/thread/ab9c8a...
>
> > > No solution though..
>
> > > On Mar 17, 2:00 am, Carl <[email protected]> wrote:
>
> > > > Ok. This is on a new quickstarted project with my changes for custom
> > > > routes. Here is the traceback and the changes to app_cfg.py and
> > > > root.py are bellow. If it's helpful I can upload the entire project.
>
> > > > URL:http://localhost:8080/prefix/1/about
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/WebError-0.10.1-
> > > > py2.5.egg/weberror/evalexception.py', line 431 in respond
> > > > app_iter = self.application(environ, detect_start_response)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/TurboGears2-2.0b7-
> > > > py2.5.egg/tg/configuration.py', line 631 in wrapper
> > > > return app(environ, start_response)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/TurboGears2-2.0b7-
> > > > py2.5.egg/tg/configuration.py', line 534 in remover
> > > > return app(environ, start_response)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/repoze.tm2-1.0a3-
> > > > py2.5.egg/repoze/tm/__init__.py', line 19 in __call__
> > > > result = self.application(environ, save_status_and_headers)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/
> > > > ToscaWidgets-0.9.5dev_20081026-py2.5.egg/tw/core/middleware.py', line
> > > > 36 in __call__
> > > > return self.wsgi_app(environ, start_response)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/
> > > > ToscaWidgets-0.9.5dev_20081026-py2.5.egg/tw/core/middleware.py', line
> > > > 59 in wsgi_app
> > > > resp = req.get_response(self.application)
> > > > File 'build/bdist.macosx-10.3-i386/egg/webob/__init__.py', line 1325
> > > > in get_response
> > > > File 'build/bdist.macosx-10.3-i386/egg/webob/__init__.py', line 1293
> > > > in call_application
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/
> > > > ToscaWidgets-0.9.5dev_20081026-py2.5.egg/tw/core/
> > > > resource_injector.py', line 67 in _injector
> > > > resp = req.get_response(app)
> > > > File 'build/bdist.macosx-10.3-i386/egg/webob/__init__.py', line 1325
> > > > in get_response
> > > > File 'build/bdist.macosx-10.3-i386/egg/webob/__init__.py', line 1293
> > > > in call_application
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/Beaker-1.2.2-
> > > > py2.5.egg/beaker/middleware.py', line 81 in __call__
> > > > return self.app(environ, start_response)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/Beaker-1.2.2-
> > > > py2.5.egg/beaker/middleware.py', line 160 in __call__
> > > > return self.wrap_app(environ, session_start_response)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/Routes-1.10.3-
> > > > py2.5.egg/routes/middleware.py', line 130 in __call__
> > > > response = self.app(environ, start_response)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/Pylons-0.9.7-
> > > > py2.5.egg/pylons/wsgiapp.py', line 125 in __call__
> > > > response = self.dispatch(controller, environ, start_response)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/Pylons-0.9.7-
> > > > py2.5.egg/pylons/wsgiapp.py', line 324 in dispatch
> > > > return controller(environ, start_response)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/Pylons-0.9.7-
> > > > py2.5.egg/pylons/controllers/core.py', line 217 in __call__
> > > > response = self._inspect_call(self.__before__)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/Pylons-0.9.7-
> > > > py2.5.egg/pylons/controllers/core.py', line 107 in _inspect_call
> > > > result = self._perform_call(func, args)
> > > > File '/Users/carl/tg2env/lib/python2.5/site-packages/TurboGears2-2.0b7-
> > > > py2.5.egg/tg/controllers.py', line 125 in _perform_call
> > > > controller.decoration.run_hooks('before_validate', remainder,
> > > > AttributeError: 'function' object has no attribute 'decoration'
>
> > > > Here is my app_cfg.py:
>
> > > > # -*- coding: utf-8 -*-
> > > > """
> > > > Global configuration file for TG2-specific settings in custom-routes.
>
> > > > This file complements development/deployment.ini.
>
> > > > """
>
> > > > from tg.configuration import AppConfig, Bunch
> > > > # Carl: needed for setup_custom_routes
> > > > from tg.configuration import Mapper, config
>
> > > > import custom_routes
> > > > from custom_routes import model
> > > > from custom_routes.lib import app_globals, helpers
>
> > > > # Carl: added custom routes function to override the default in
> > > > AppConfig
> > > > 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.
> > > > """
> > > > map = Mapper(directory=config['pylons.paths']['controllers'],
> > > > always_scan=config['debug'])
>
> > > > map.connect('prefix', 'prefix/{id}/{action}', controller='root')
>
> > > > # Setup a default route for the root of object dispatch
> > > > map.connect('*url', controller='root',
> > > > action='routes_placeholder')
>
> > > > config['routes.map'] = map
>
> > > > # Carl: assign the custom routes function to AppConfig.
> > > > # It's equivalent to subclassing AppConfig in this case
> > > > AppConfig.setup_routes = custom_setup_routes
>
> > > > base_config = AppConfig()
> > > > base_config.renderers = []
>
> > > > base_config.package = custom_routes
>
> > > > #Set the default renderer
> > > > base_config.default_renderer = 'genshi'
> > > > base_config.renderers.append('genshi')
> > > > # if you want raw speed and have installed chameleon.genshi
> > > > # you should try to use this renderer instead.
> > > > # warning: for the moment chameleon does not handle i18n translations
> > > > #base_config.renderers.append('chameleon_genshi')
>
> > > > #Configure the base SQLALchemy Setup
> > > > base_config.use_sqlalchemy = True
> > > > base_config.model = custom_routes.model
>
> > > > And here are my changes to the RootController:
>
> > > > # -*- coding: utf-8 -*-
> > > > """Main Controller"""
>
> > > > from tg import expose, flash, require, url, request, redirect,
> > > > validate
> > > > from pylons.i18n import ugettext as _, lazy_ugettext as l_
>
> > > > from custom_routes.lib.base import BaseController
> > > > # Carl: DecoratedController will be the base class for the root
> > > > controller
> > > > from tg.controllers import DecoratedController
>
> > > > from custom_routes.model import DBSession, metadata
> > > > from custom_routes.controllers.error import ErrorController
>
> > > > __all__ = ['RootController']
>
> > > > class RootController(DecoratedController):
> > > > #class RootController(BaseController):
> > > > # The rest is the same
>
> > > > On Mar 16, 1:09 pm, Mark Ramm <[email protected]> wrote:
>
> > > > > A code sample, and traceback would help us help you better ;)
>
> > > > > On Mon, Mar 16, 2009 at 2:43 PM, Carl <[email protected]> wrote:
>
> > > > > > Hello Gustavo,
> > > > > > What didn't work for me is that if my controller I just subclasses
> > > > > > the BaseController, then it looks like the routing in app_cfg.py is
> > > > > > ignored. TGController calls a _get_routing_info() function defined
> > > > > > in
> > > > > > ObjectDispatchController that does just object dispatch.
>
> > > > > > Gigi
>
> > > > > > On Mar 16, 9:46 am, Gustavo Narea <[email protected]> wrote:
> > > > > >> Hello, Carl.
>
> > > > > >> On Saturday March 14, 2009 16:49:17 Carl wrote:
>
> > > > > >> > I tried it but it didn't work for me. Maybe I got the URL syntax
> > > > > >> > wrong. What URLs map to your custom routes?
>
> > > > > >> Those whose paths look like: /<string>/<integer>
>
> > > > > >> > Also, from reading the
> > > > > >> > Routes manual I got the impression that variables are words with
> > > > > >> > a
> > > > > >> > colon in the end (e.g 'prefix:'), but your routes look like
> > > > > >> > regular
> > > > > >> > expressions.
>
> > > > > >> Placeholders can be defined with {brackets} and :colons:, but the
> > > > > >> later is
> > > > > >> deprecated.
>
> > > > > >> In my case I just wanted to force an integer in one of the
> > > > > >> variables, hence I
> > > > > >> used a regular expression. It's optional.
>
> > > > > >> Cheers!
>
> > > > > >> PS: What didn't exactly work?
> > > > > >> --
> > > > > >> Gustavo Narea <xri://=Gustavo>.
> > > > > >> | Tech blog: =Gustavo/(+blog)/tech ~ About me: =Gustavo/about |
>
> > > > > --
> > > > > 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
-~----------~----~----~----~------~----~------~--~---