2012-02-03 3 views
1

J'essaie d'ajouter une fonctionnalité de connexion au web.pytodo example.Web.py todo liste avec login

Ceci est mon code:

""" Basic todo list using webpy 0.3 """ 
import web 
import model 

### Url mappings 

urls = (
    '/', 'Index', 
    '/login', 'Login', 
    '/logout', 'Logout', 
    '/del/(\d+)', 'Delete', 
) 


### Templates 
render = web.template.render('templates', base='base') 
app = web.application(urls, locals()) 
session = web.session.Session(app, web.session.DiskStore('sessions')) 

allowed = (
    ('user','pass'), 
    ('tom','pass2') 
) 

class Login: 

    login_form = web.form.Form(web.form.Textbox('username'), 
     web.form.Password('password'), 
     web.form.Button('Login'), 
     ) 

    def GET(self): 
     f = self.login_form() 
     return render.login(f) 

    def POST(self): 
     # Validation 
     if not self.login_form.validates(): 
      print "it didn't validate!" 

     session.logged_in = True 
     raise web.seeother('/') 


class Logout: 
    def GET(self): 
     session.logged_in = False 
     raise web.seeother('/') 

class Index: 

    form = web.form.Form(
     web.form.Textbox('title', web.form.notnull, 
      description="I need to:"), 
     web.form.Button('Add todo'), 
    ) 

    def GET(self): 
     print "logged_in " + str(session.get('logged_in', False)) 
     if session.get('logged_in', False): 
      """ Show page """ 
      todos = model.get_todos() 
      form = self.form() 
      return render.index(todos, form) 
     else: 
      raise web.seeother('/login') 

    def POST(self): 
     """ Add new entry """ 
     form = self.form() 
     if not form.validates(): 
      todos = model.get_todos() 
      return render.index(todos, form) 
     model.new_todo(form.d.title) 
     raise web.seeother('/') 



class Delete: 

    def POST(self, id): 
     """ Delete based on ID """ 
     id = int(id) 
     model.del_todo(id) 
     raise web.seeother('/') 


app = web.application(urls, globals()) 

if __name__ == '__main__': 
    app.run() 

Lorsque l'utilisateur fait un POST dans /login, logged_in est toujours False.

Des idées pourquoi?

+0

La classe Login semble afficher uniquement un formulaire. Qu'est-ce qui se passe quand ils soumettent le nom d'utilisateur/PWD. Je ne vois pas le code qui se connecte à l'utilisateur. – Sid

+0

@Sid: Rien de spécial là-bas. Vous pouvez écrire ce que vous voulez, cela se connecte toujours quand vous faites un 'POST' mais la variable' logged_in' ne change jamais en 'True'. – Macarse

+0

Alors pourquoi ce morceau de code paramètre-t-il explicitement le paramètre logged_in à True et False lors de la connexion et de la déconnexion http://webpy.org/docs/0.3/sessions – Sid

Répondre

1

Je viens de le réparer. Il me manquait un code d'initialisation de session. Voici le code de travail:

""" Basic todo list using webpy 0.3 """ 
import web 
import model 

### Url mappings 

urls = (
    '/', 'Index', 
    '/login', 'Login', 
    '/logout', 'Logout', 
    '/del/(\d+)', 'Delete', 
) 


web.config.debug = False 
render = web.template.render('templates', base='base') 
app = web.application(urls, locals()) 
session = web.session.Session(app, web.session.DiskStore('sessions')) 

allowed = (
    ('user','pass'), 
) 

class Login: 

    login_form = web.form.Form(web.form.Textbox('username', web.form.notnull), 
     web.form.Password('password', web.form.notnull), 
     web.form.Button('Login'), 
     ) 

    def GET(self): 
     f = self.login_form() 
     return render.login(f) 

    def POST(self): 
     if not self.login_form.validates(): 
      return render.login(self.login_form) 

     username = self.login_form['username'].value 
     password = self.login_form['password'].value 
     if (username,password) in allowed: 
      session.logged_in = True 
      raise web.seeother('/') 

     return render.login(self.login_form) 


class Logout: 
    def GET(self): 
     session.logged_in = False 
     raise web.seeother('/') 

class Index: 

    form = web.form.Form(
     web.form.Textbox('title', web.form.notnull, 
      description="I need to:"), 
     web.form.Button('Add todo'), 
    ) 

    def GET(self): 
     if session.get('logged_in', False): 
      """ Show page """ 
      todos = model.get_todos() 
      form = self.form() 
      return render.index(todos, form) 
     else: 
      raise web.seeother('/login') 

    def POST(self): 
     """ Add new entry """ 
     form = self.form() 
     if not form.validates(): 
      todos = model.get_todos() 
      return render.index(todos, form) 
     model.new_todo(form.d.title) 
     raise web.seeother('/') 



class Delete: 

    def POST(self, id): 
     """ Delete based on ID """ 
     id = int(id) 
     model.del_todo(id) 
     raise web.seeother('/') 


app = web.application(urls, globals()) 

if web.config.get('_session') is None: 
    session = web.session.Session(app, web.session.DiskStore('sessions'), {'count': 0}) 
    web.config._session = session 
else: 
    session = web.config._session 

if __name__ == '__main__': 
    app.run() 
+0

pourriez-vous s'il vous plaît expliquer pourquoi vérifiez-vous la disponibilité des sessions par 'session.get (' logged_in, False): '. Ce n'est pas raisonnable pour moi parce que quand vous obtenez une session fausse, vous retournez votre page principale. – muradin

+0

Pouvez-vous s'il vous plaît coller votre modèle, le mien ne fonctionne pas pour une raison quelconque – itsavy