The user() function is called with an additional argument in the URL (e.g., 
/user/login, /user/register, etc.). This extra argument is accessible via 
request.args[0]. Now, the Auth class has a __call__ method, so the auth 
object is callable. When you call it via auth(), the __call__ method 
essentially acts like a router -- it reads request.args[0] and then calls 
whatever Auth method is specified (or it redirects to /user/login if there 
is no request.args[0]). You can see this 
here: http://code.google.com/p/web2py/source/browse/gluon/tools.py#1143. In 
particular:

return getattr(self,args[0])() 

gets the Auth method named in args[0] and calls that method.

Note, you can also manually create your own actions (or do your own routing 
based on request.args) and call the individual Auth methods directly. For 
example, you could create a dedicated "register" action via:

def register():
    return dict(form=auth.register())

Crud works in a similar way.

Anthony

On Thursday, February 23, 2012 8:34:47 PM UTC-5, davidkw wrote:
>
> I'm reading through the tutorial and just came across the part that 
> adds the code: 
>
> from gluon.tools import Auth 
> auth = Auth(db) 
> auth.define_tables() 
>
> def user(): 
>     return dict(form=auth()) 
>
> And suddenly login, register, etc were enabled. This is the first 
> "magic" I've come across in web2py that I don't understand well. I 
> understand that auth.define_tables() creates the tables for the user 
> data, but I'm not sure how def user():... suddenly adds all the 
> registration and login pages. 
>
> Could someone give me a quick walkthrough of what's going on?

Reply via email to