Autenticación, sesiones y templates en Web.py con PostgreSQL

Como puedo usar sesión, autenticación y templates en un proyecto?

Solución:

Crear un fichero code.py:

  1 # -*- coding: utf-8 -*-
  2 """
  3 Author: Jorge A. Toro <jolthgs@gmail.com>
  4 
  5 Session with DBStore - Web.py 0.37
  6 
  7 Create Database "test1" and "tsessions" table with the following schema into PostgreSQL:
  8 
  9 $ createdb test1
 10 $ psql -d test1
 11 
 12 create table tsessions (
 13     session_id char(128) UNIQUE NOT NULL,
 14     atime timestamp NOT NULL default current_timestamp,
 15     data text
 16 );
 17 
 18 create table users (
 19     id serial primary key,
 20     username varchar(10) UNIQUE NOT NULL,
 21     password varchar(10)
 22 );
 23 
 24 insert into users (username, password) values ('jolth','qwerty');
 25 
 26 """
 27 import web
 28 
 29 # DEBUG
 30 web.config.debug = False
 31 
 32 # URL's
 33 urls = (
 34     "/", "login",
 35     "/dashboard", "dashboard",
 36     "/logout", "logout"
 37 )
 38 
 39 app = web.application(urls, locals())
 40 
 41 # Sessions
 42 db = web.database(dbn="postgres", db="test1", user="postgres", pw="qwerty")
 43 store = web.session.DBStore(db, "tsessions")
 44 session = web.session.Session(app, store, initializer={"count": 0})
 45 
 46 # Templates
 47 render = web.template.render("templates", globals={"session": session})
 48 
 49 # Decorador
 50 def Session(url):
 51     def check(*args, **kwargs):
 52         """
 53             Decorador usado para verificar que 
 54             la sesión este activa.
 55         """
 56         try:
 57             if not session.loggedin:
 58                 raise web.seeother('/')
 59         except: raise web.seeother('/')
 60         return url(*args, **kwargs)
 61     return check
 62 
 63 class login:
 64     def GET(self):
 65         """
 66             Página de Login
 67         """
 68         return render.login()
 69 
 70     def POST(self):
 71         """
 72             Comprueba si el usuario se puede logear
 73             y crea atributos para la sesión.
 74         """
 75         import sys
 76         inputData = web.input()
 77 
 78         check = db.query("select * from users where username=$username and password=$password",
 79                 vars=inputData)
 80 
 81         if check:
 82             session.loggedin = True
 83             session.username = inputData.username
 84             print >> sys.stderr, "Login Successful"
 85             raise web.seeother("/dashboard")
 86         else:
 87             print >> sys.stderr, "Login Failed"
 88             return render.login("usuario o contraseña inválida")
 89 
 90 class dashboard:
 91     @Session
 92     def GET(self):
 93         session.count = session.count + 1
 94         return render.dashboard()
 95 
 96 class logout:
 97     def GET(self):
 98         """
 99             Mata la sesión
100         """
101         session.kill()
102         return 'Logout.....'
103 
104 
105 if __name__ == "__main__": app.run()

Crear un sistema de plantillas con login.html:

  1 $def with (message=None)
  2 <!doctype html>
  3 <html lang="es">
  4 <head>
  5     <meta charset="utf-8">
  6     <title>Test :: Login</title>
  7 </head>
  8 <body>
  9     <form method="post" action="/">
 10         <input type="text" name="username" placeholder="Username" required title="Se necesita un nombre de usuario">
 11         <input type="password" name="password" placeholder="Password" required title="Se necesita una contraseña">
 12         <button type="submit">Entrar</button>
 13     </form>
 14     <p>$message</p>
 15 </body>
 16 </html>

y dashboard.html:

  1 $def with ()
  2 <!doctype html>
  3 <html lang="es">
  4 <head>
  5     <title>Dashboard</title>
  6 </head>
  7 <body>
  8 usuario: $session.username
  9 
 10 count: $session.count
 11 <br>
 12 <br>
 13 <a href="/logout">Logout</a>
 14 </body>
 15 </html>

Autor: Jorge A. Toro

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s