You are right but it only breaks backward compatibility in a case where things would be misleading. Here are some example:
# old syntax that still works URL('a','c','f') URL(a='a',c='c',f='f') URL(f='f',r=request) #new syntax that resulted in an error before URL('f') URL('c','f') URL(f='f') URL(c='c',f='f') ## changed of behaviour URL('a',r=request) was /a/current_controller/current_function now was /current_app/current_controller/a I.e. the change of behavior only occurs if the user explicitly specifies r and a (without naming a) but not f. I.e. if the user is specifying redundant information that may be conflicting (because a may differ from r.application). Users should not be doing this anyway. I have never seen anybody doing this. Did I miss something? can you see any other case when the behavior would change? What do other people think? Massimo On Jul 29, 8:27 pm, Thadeus Burgess <thade...@thadeusb.com> wrote: > Massimo, you cannot > > I am sorry but that would break backwards compatibility. > > Say if in certain apps you have this (in alot of the earlier apps on > web2py.com do this too) > > URL(request.application, 'static', 'logo.png') > > Or > > URL(request.application, 'default', 'index') > > Unfortunately, we cannot re-arrange the variables defined in URL from this > order > > def URL( > a=None, > c=None, > f=None, > r=None, > args=[], > vars={}, > anchor='', > extension=None, > env=None > ): > > -- > Thadeus > > On Thu, Jul 29, 2010 at 8:23 PM, Michele Comitini > > <michele.comit...@gmail.com> wrote: > > thumbs up! > > > 2010/7/30 mdipierro <mdipie...@cs.depaul.edu> > > >> I took it one step further... > > >> >>> URL() > >> /app/default/index > >> >>> URL('test') > >> /app/default/test > >> >>> def test(): return 'test' > >> >>> URL(test) > >> /app/default/test > >> >>> URL('static','filename') > >> /app/static/filename > >> >>> URL('other','static','filename') > >> /other/static/filename > > >> No more r=, c=, f= needed but all optional. > > >> On Jul 28, 6:28 pm, Thadeus Burgess <thade...@thadeusb.com> wrote: > >> > SORRY! =D > > >> > -- > >> > Thadeus > > >> > On Wed, Jul 28, 2010 at 6:22 PM, mdipierro <mdipie...@cs.depaul.edu> > >> > wrote: > >> > > WOW. Uploading to trunk. Now I need to revise the book again. :-( > > >> > > On Jul 28, 5:51 pm, Thadeus Burgess <thade...@thadeusb.com> wrote: > >> > >> >>> URL(r=request, c='hello', f='world', args=['hi'], > >> > >> >>> vars={'q':'greetings'}, anchor='the_world') > > >> > >> '/welcome/hello/world/hi#the_world?q=greetings'>>> URL(c='hello', > >> > >> f='world', args=['hi'], vars={'q':'greetings'}, anchor='the_world') > > >> > >> '/welcome/hello/world/hi#the_world?q=greetings' > > >> > >> Attached is the diff > > >> > >> This should not effect any current usages of URL, but from this point > >> > >> forward we shouldn't have to specify r=request! > > >> > >> -- > >> > >> Thadeus > > >> > >> On Wed, Jul 28, 2010 at 5:21 PM, mdipierro <mdipie...@cs.depaul.edu> > >> > >> wrote: > >> > >> > ok > > >> > >> > On Jul 28, 4:52 pm, Thadeus Burgess <thade...@thadeusb.com> wrote: > >> > >> >> For a little more advanced version of what Massimo just posted: > > >> > >> >> This allows you to use both. > > >> > >> >> URL(r=request, c=<controller>, f=.....) > >> > >> >> and > >> > >> >> URL(c=<controller>, f=<function>.....) > > >> > >> >> >>http://packages.python.org/web2py_utils/init.html#gurlhttp://hg.thade...... > > >> > >> >> The reason we have to pass the request to URL each time is because > >> > >> >> it > >> > >> >> is just imported into the context. Since it is just a python > >> > >> >> function, > >> > >> >> it has no knowledge of request. > > >> > >> >> Why can't we do something like gURL from within web2py? When > >> > >> >> building > >> > >> >> the context, why can't we make URL a loaded function that will get > >> > >> >> request passed to it, exactly how gURL works. > > >> > >> >> Effectively, we won't have to pass request into URL function > >> > >> >> anymore... ever. > > >> > >> >> If your interested, I can work on the patch. > > >> > >> >> -- > >> > >> >> Thadeus > > >> > >> >> On Wed, Jul 28, 2010 at 3:56 PM, mdipierro > >> > >> >> <mdipie...@cs.depaul.edu> wrote: > >> > >> >> > 1) It is a bit more complex because of static, appadmin, and > >> > >> >> > admin. > >> > >> >> > You can map > > >> > >> >> > /function/var1/var2 > > >> > >> >> > into > > >> > >> >> > /app/controller/function/var1/var2 > > >> > >> >> > using a file routes.py > >> > >> >> > ------- begin file > >> > >> >> > routes_in=[ > >> > >> >> > ('/admin/$anything','/admin/$anything'), > >> > >> >> > ('/static/$anything','/app/static/$anything'), > >> > >> >> > ('/appadmin/$anything','/app/appadmin/$anything'), > >> > >> >> > ('/$anything','/app/default/$anything'), > >> > >> >> > ] > >> > >> >> > routes_out=[(y,x) for (x,y) in routes_in] > >> > >> >> > ----- end file > > >> > >> >> > 2) in db.py define > > >> > >> >> > def url(f,args={},vars={}): > >> > >> >> > return URL(r=request,f=f,args=args,vars=vars) > >> > >> >> > def go(f,args={},vars={},flash=''): > >> > >> >> > session.flash=flash > >> > >> >> > return go(url(f=f,args=args,vars=vars)) > > >> > >> >> > and use > > >> > >> >> > url('index') > > >> > >> >> > or > > >> > >> >> > go('index',flash='you are being redirected') > > >> > >> >> > I do it all the time > > >> > >> >> > On Jul 28, 3:29 pm, VP <vtp2...@gmail.com> wrote: > >> > >> >> >> I'm a newbie, so my questions probably have easy answers, but > >> > >> >> >> anyway. > >> > >> >> >> Among a few things, there are two I don't understand and think > >> > >> >> >> can be > >> > >> >> >> simplified. > > >> > >> >> >> 1. this url: app/controller/function/var1/var2 > > >> > >> >> >> For me at least, most of the time I probably have only one > >> > >> >> >> controller. If there is one controller, may be we should get > >> > >> >> >> rid of > >> > >> >> >> "controller" in the url? This will be sufficient: > >> > >> >> >> app/f/a/b/c > > >> > >> >> >> 2. Similarly, most of the time I have only one app (current > >> > >> >> >> app). > >> > >> >> >> But I use URL() a lot and every time I have to pass in request > >> > >> >> >> like > >> > >> >> >> this URL(r=request, f='foo'). > > >> > >> >> >> Why do I have to pass in request if I have only one app, one > >> > >> >> >> controller? > > >> > >> >> >> Furthermore, isn't request supposed to be global? If so, do we > >> > >> >> >> have > >> > >> >> >> to pass it in? > > >> > >> url_proxy.diff > >> > >> 1KViewDownload