OK, so specifically regarding routes_onerror, has the recent patch eliminated the infinite loop problem (and not broken anything else), as far as you can tell?
And yes, the pattern-based and parameter-based systems cannot be mixed -- you must use one or the other. routes_onerror, however, works with either system. Note, in the parameter-based system, you can do: routers = dict( BASE = dict( default_application = 'appname', root_static = ['favicon.ico', 'robots.txt', 'sitemap.xml'] ), ) to set static files that should be accessible from the root URL. Anthony On Sunday, November 20, 2011 8:53:42 AM UTC-5, Niphlod wrote: > > so, here's a few tests on the functionality at the current state > (patch applied). Maybe we can sum up a little "recipe" to explain > better > the "interaction" between parameter based and pattern based > rewrite.... > > These settings for production sites are a real deal, so, here we > are... > The test is a basic app, with an errors/index function expressed as: > > def index(): > response.status = request.vars.code > return dict(vars=request.vars) > > The test is "passed" when: > a) the appname is stripped from the url > b) the error handler doesn't loop forever > c) a request made to http://host.domain/robots.txt returns the > contents of appname/static/robots.txt > d) a request made to http://host.domain/favicon.ico returns the > contents of appname/static/favicon.ico > e) a request made to http://host.domain/sitemap.xml returns the > contents of appname/static/sitemap.xml > > TEST 1: > ---routes.py--- > default_application = 'appname' > routes_onerror = [ > ('*/*', '/appname/errors/index') > ] > > results : a) not working (that's expected), b) working, c), d), e) not > working (expected behaviour) > > TEST 2: > ---routes.py--- > default_application = 'appname' > routers = dict( > BASE = dict( > default_application = 'appname', > ), > ) > > routes_onerror = [ > ('*/*', '/errors/index') > ] > > results: a) working, b) working, c) working, d) working, e) not > working > > ---routes.py--- > default_application = 'appname' > routes_in = ( > ('/robots.txt', '/static/robots.txt'), > ('/sitemap.xml', '/static/sitemap.xml'), > ('/favicon.ico', '/static/favicon.ico'), > ) > > routes_out = ( > ('/static/robots.txt', '/robots.txt'), > ('/static/sitemap.xml', '/sitemap.xml'), > ('/static/favicon.ico', '/favicon.ico'), > ) > > routers = dict( > BASE = dict( > default_application = 'appname', > ), > ) > > routes_onerror = [ > ('*/*', '/errors/index') > ] > > results: a) working, b) working, c) working, d) working, e) not > working > > TEST 3: > ---routes.py--- > default_application = 'appname' > routes_in = ( > ('/(?P<any>.*)', '/appname/\g<any>'), > ('/favicon.ico', '/appname/static/favicon.ico'), > ('/sitemap.xml', '/appname/static/sitemap.xml'), > ('/robots.txt', '/appname/static/robots.txt') > ) > > routes_out = ( > ('/appname/(?P<any>.*)', '/\g<any>'), > ('/appname/static/favicon.ico', '/favicon.ico' ), > ('/appname/static/robots.txt', '/robots.txt'), > ('/appname/static/sitemap.xml', '/sitemap.xml') > ) > > routes_onerror = [ > ('*/*', '/errors/index') > ] > > results: a) working, b) working, c) working, d) working, e) not > working > > TEST 4: > default_application = 'appname' > routes_in = ( > ('/favicon.ico', '/appname/static/favicon.ico'), > ('/robots.txt', '/appname/static/robots.txt'), > ('/sitemap.xml', '/appname/static/sitemap.xml'), > ('/(?P<any>.*)', '/appname/\g<any>') > ) > > routes_out = ( > ('/appname/static/favicon.ico', '/favicon.ico' ), > ('/appname/static/robots.txt', '/robots.txt'), > ('/appname/static/sitemap.xml', '/sitemap.xml'), > ('/appname/(?P<any>.*)', '/\g<any>') > ) > results: a) working, b) working, c) working, d) working, e) working > > So, to sum up, something I think I have learned from the experience: > - pattern-based and parameter-based aren't meant to use together. With > pattern-based system "root files" as robots.txt and favicon.ico are > handled internally but not sitemap.xml (or anything else) > - routes_onerror seems to work independantly of the "rewrite method" > - in pattern-based system the order matters. This is an expected > behaviour but nonetheless worth to remember. As an example, take TEST > 3 and TEST 4... sitemap.xml gets "taken" by the ('/(?P<any>.*)', '/ > appname/\g<any>') tuple in TEST 3 before the "exact match". > - parameter-based is really helpful to map domains to apps or if you > have multiple apps but only one "preferred", or with language-based > redirections. With parameter-based system you can access other apps by > "normal" non-rewritten urls. With pattern-based if you want to have a > "default" application you have to map any additional application > specifically. > >