OK, thanks. Tricky. My exposure to classes didn't get as far as the __call__ method.
That explains how it works. On Feb 8, 7:17 am, Anthony <abasta...@gmail.com> wrote: > > Where would I add these? > > Add the links wherever you want them in your user interface. > > > I am really mystified how the auth() class call receives the method as > > its argument from these urls assuming that the user action looks like: > > > def user() > > return dict(form=auth()) > > Auth is a callable class, so when you call auth(), you are calling the > Auth.__call__ method. That method checks to see if request.args[0] is among > the set of supported Auth methods, and if so, it calls the associated > method via: > > return getattr(self, args[0])() > > So, the __call__ method essentially acts as a router to the other Auth > methods. Of course, you can also call those methods directly rather than > relying on request.args and the __call__ router. > > > I am really mystified about how one can index the request.args using > > parens instead of square braces? > > > as in: > > > <h2>{{=T( request.args(0).replace('_',' ').capitalize() )}}</h2> > > request.args is a storage.List object, which acts like a regular Python > list but is also callable (i.e., it has a __call__ method). You can call it > with an index, and it will return the same value as if you had indexed via > the brackets syntax. The only difference is if you call it with an invalid > index, instead of throwing an exception, it simply returns None. So, let's > say request.args is an empty list -- in that case, request.args(0) is None, > but request.args[0] will result in the following error: "IndexError: list > index out of range". This allows you to do things like passing > request.args(0) as a value without first having to check whether it exists. > > Anthony