Differences between revisions 1 and 11 (spanning 10 versions)
Revision 1 as of 2009-11-19 02:07:06
Size: 1098
Editor: BenGolding
Comment:
Revision 11 as of 2011-02-15 06:05:18
Size: 2339
Editor: localhost
Comment: converted to 1.6 markup
Deletions are marked like this. Additions are marked like this.
Line 10: Line 10:
class Login: class User:
Line 16: Line 16:
        crypted_passwd = pwd.getpwent(self.username).pw_passwd
        crypted_passwd = pwd.getpwnam(username)[1]
        return (crypt.crypt(self.password, crypted_passwd) == crypted_passwd)
        try:
            pw = pwd.getpwnam(self.username)
        except KeyError:
            return False

        return (crypt.crypt(self.password, pw.pw_passwd) == pw.pw_passwd)
Line 24: Line 26:
from albatross.form import * from albatross.ext.form import *
Line 27: Line 29:
    def __init__(self, login):
        elements = Fieldset((
    def __init__(self, user):
        fields = (
Line 31: Line 33:
        )
        fieldsets = (Fieldset(fields), )
        buttons = Buttons((
            Button('Login', 'login'),
Line 32: Line 38:
        FieldsetForm.__init__(self, 'User login', (elements, ))         FieldsetForm.__init__(self, 'User login', fieldsets, buttons=buttons)
Line 34: Line 40:
        self.load(login)         self.load(user)
Line 37: Line 43:
Create the form in page_enter We need to create an instance of the Login model and maintain that so that any captured data is retained. In our {{{login.py}}}, we use:
Line 39: Line 45:
XXX need a login button {{{#!python
def page_enter(ctx):
    if not ctx.has_value('user'):
        ctx.locals.user = User('', '')
        ctx.add_session_vars('user')
        ctx.locals.login_form = LoginForm(ctx.locals.user)
        ctx.add_session_vars('login_form')
    ctx.locals.login_error = ''
}}}
Line 41: Line 55:
Render the form using alx-form In {{{login.html}}}, to display the form to the user we use:

{{{#!html
<al-form method="post">

  <alx-form name="login_form" errors />

  <al-expr expr="login_error" />

</al-form>
}}}

When the user presses the "Login" button, it will come back to our {{{page_process}}} method in {{{login.py}}}. We check if the username and password are correct and punt them into the application proper (via the "search" page) or tell them they've got it wrong.

{{{#!python
def page_process(ctx):
    if ctx.req_equals('login'):
        # nothing to validate
        ctx.locals.login_form.merge(ctx.locals.user)
        if ctx.locals.user.is_password_valid():
            ctx.redirect('search')
        else:
            ctx.locals.login_error = 'Login incorrect'
}}}

A simple example

Here's a simple example of how we could use Albatross Forms to collect a username and password from the user.

We need to define a model class to hold the data:

   1 import pwd, crypt
   2 
   3 class User:
   4     def __init__(self, username, password):
   5         self.username = username
   6         self.password = password
   7 
   8     def is_password_valid(self):
   9         try:
  10             pw = pwd.getpwnam(self.username)
  11         except KeyError:
  12             return False
  13         return (crypt.crypt(self.password, pw.pw_passwd) == pw.pw_passwd)

Next, we need to define a form to display the fields:

   1 from albatross.ext.form import *
   2 
   3 class LoginForm(FieldsetForm):
   4     def __init__(self, user):
   5         fields = (
   6             TextField('Username', 'username'),
   7             PasswordField('Password', 'password'),
   8         )
   9         fieldsets = (Fieldset(fields), )
  10         buttons = Buttons((
  11             Button('Login', 'login'),
  12         ))
  13         FieldsetForm.__init__(self, 'User login', fieldsets, buttons=buttons)
  14         
  15         self.load(user)

We need to create an instance of the Login model and maintain that so that any captured data is retained. In our login.py, we use:

   1 def page_enter(ctx):
   2     if not ctx.has_value('user'):
   3         ctx.locals.user = User('', '')
   4         ctx.add_session_vars('user')
   5         ctx.locals.login_form = LoginForm(ctx.locals.user)
   6         ctx.add_session_vars('login_form')
   7     ctx.locals.login_error = ''

In login.html, to display the form to the user we use:

When the user presses the "Login" button, it will come back to our page_process method in login.py. We check if the username and password are correct and punt them into the application proper (via the "search" page) or tell them they've got it wrong.

   1 def page_process(ctx):
   2     if ctx.req_equals('login'):
   3         # nothing to validate
   4         ctx.locals.login_form.merge(ctx.locals.user)
   5         if ctx.locals.user.is_password_valid():
   6             ctx.redirect('search')
   7         else:
   8             ctx.locals.login_error = 'Login incorrect'

None: Simple_forms_example (last edited 2011-02-15 06:05:18 by localhost)