Tutorial de web.py

Instalación
Para instalar web.py descarga el módulo web.py en el directorio donde crearás tu aplicación.
Gestión de URLs
Crea un nuevo archivo (puedes llamarlo code.py) en el directorio donde has copiado el módulo web.py y teclea lo siguiente para importar el módulo:
import web
La variable urls es una tupla que se utiliza para emparejar las URLs de la aplicación con sus correspondientes controladores:
urls = (
'/', 'view'
)
La primera parte es una expresión regular que representa el path. Por ejemplo: /, /help/faq, /item/(\d+), etc. En el último ejemplo la expresión regular \d+ representa una secuencia de dígitos. Los paréntesis hacen que la expresión a la que rodean sea capturada para luego.
La segunda parte es el nombre de la clase a la que se le enviará la petición. Por ejemplo: view, welcomes.hello (que utiliza la clase hello del módulo welcomes), get_\1, etc. En el último ejemplo, \1 es sustituido por la primera captura de la expresión regular anterior. Cualquier captura restante también será pasada a la función.
El siguiente paso es crear la clase view con su método GET, éste se ejecutará cuando alguien llame al método GET de HTTP con la URL asignada a esa clase en la variable urls (por ejemplo cuando alguien visite dicha URL desde un navegador web):
class view:
def GET(self):
print 'hola mundo!'
Para finalizar tu primera aplicación teclea las siguientes líneas:
web.internalerror = web.debugerror
if __name__ == '__main__': web.run(urls, web.reloader)
La primera línea es para depurar errores. Hace que web.py muestre una página con información de interés cada vez que se produce un error.
La segunda línea le dice a web.py que inicie la aplicación cuando el archivo sea ejecutado. El primer argumento es la variable urls anteriormente definida y el segundo es información para el middleware -funciones internas que ayudan con algunas partes de tu aplicación. En este caso estamos usando el reloader, que recarga automáticamente el código fuente cada vez que lo modificas. De esta forma evitas tener que reiniciar el servidor continuamente. Es muy útil en la fase de desarrollo, aunque en la fase de producción posiblemente no lo necesites. También está disponible web.profiler, que muestra información sobre la 'rapidez' de ejecución de tu código, de forma que puedas optimizarlo.
Para iniciar el servidor (web.py trae incorporado un servidor web interno) y ejecutar la aplicación teclea lo siguiente en la línea de comandos (puedes especificar un puerto pasándolo como parámetro):
python code.py
Visita la dirección http://0.0.0.0:8080/ con tu navegador web.
También puedes ejecutar code.py como un script CGI o FastCGI. Como web.py está construido sobre WSGI (el interfaz estándar para aplicaciones web de Python), puedes ejecutarlo incluso en mod_python si lo deseas.
Plantillas
Nota: Para seguir esta parte del tutorial debes tener instalado el sistema de plantillas Cheetah. Este tutorial de una página cubre todas sus características esenciales.
Crea un nuevo directorio denominado templates (en el mismo directorio donde tienes tu código). En él crea un nuevo archivo con extensión .html (puedes llamarlo view.html) y escribe lo siguiente:
#if $name
hola $name!
#else
hola mundo!
#end if
Edita de nuevo code.py y modifica la clase view para que tenga el siguiente aspecto:
class view:
def GET(self):
name = 'caracola'
web.render('view.html')
Visita de nuevo la dirección http://0.0.0.0:8080/.
Advertencia: Los desarrolladores de web.py están diseñando e implementando un nuevo sistema de plantillas (es similar a Cheetah, pero pretende ser más sencillo y potente) con la intención de adoptarlo en el futuro.
Más sobre URLs
Modifica la lista de URLs de la siguiente forma:
urls = (
'/(.*)', 'view'
)
Ahora modifica la clase view para que quede así:
class view:
def GET(self,name):
web.render('view.html')
Ahora cualquier página que visites será asignada a la clase view (debido a la expresión regular introducida en el path /(.*)) y el método GET recibirá como parámetro el nombre de la página. Por lo tanto si visitas /pedro verás hola pedro y si visitas / verás hola mundo.
Acceso a Bases de Datos
Nota: Para seguir esta parte del tutorial debes tener instalado el sistema de gestión de bases de datos PostgreSQL y el adaptador de Python para PostgreSQL psycopg2.
Edita code.py y sustituye la última línea de código por lo siguiente:
if __name__ == '__main__':
web.db_parameters = dict(dbn='postgres', user='tu', pw='tupass', db='nombredb')
web.run(urls, web.reloader)
Debes cambiar los valores por los correspondientes a tu sistema. Por ejemplo, los usuarios de MySQL deben cambiar el valor de dbn a mysql.
Crea una tabla sencilla en tu base de datos:
CREATE TABLE todo (
id serial primary key,
title text,
created timestamp default now(),
done boolean default 'f'
);
Inserta también una tupla en la tabla:
INSERT INTO todo (title) VALUES ('aprender web.py');
Modifica la clase view para que tenga el siguiente aspecto:
class view:
def GET(self):
web.select("todo")
web.render('view.html')
Edita el archivo view.html para que contenga el siguiente código:
<form method="post" action="add">
<p>
<input type="text" name="title" />
<input type="submit" value="Nuevo" />
</p>
</form>
Edita de nuevo el archivo code.py. En primer lugar añade una nueva URL a la lista:
urls = (
'/', 'view',
'/add', 'add'
)
Después crea una nueva clase denominada add justo debajo de la clase view:
class add:
def POST(self):
i = web.input()
n = web.insert('todo', title=i.title)
web.seeother('./#t'+str(n))
web.insert devuelve el ID del nuevo elemento insertado y web.seeother se utiliza para redireccionar al usuario hacia él.
Rápidamente: web.transact() comienza una transacción, web.commit la lleva a cabo y web.rollback la interrumpe. web.update funciona igual que web.insert sólo que en lugar de devolver un ID lo recibe (o una cadena correspondiente a una cláusula WHERE) como parámetro después del nombre de la tabla.
Ahora ya puedes añadir tareas a la lista y guardarlas en la base de datos.
Nota al Margen: Los Objetos de Almacenamiento
Tanto web.input como web.query, así como otros elementos en web.py, devuelven 'Objetos de Almacenamiento' (Storage Objects). Un objeto de este tipo es como un diccionario a excepción de que d.foo es lo mismo que d['foo']. Así hay que teclear menos.
Cookies
Las cookies funcionan prácticamente del mismo modo que web.input. web.cookies() devuelve un Objeto de Almacenamiento con todas las cookies inicializadas mientras que web.setcookie(name, value, expires="") inicializa las cookies.
Tanto web.input como web.cookies pueden recibir una serie de argumentos y palabras clave. Así si llamas a web.input('color', times=1), por ejemplo, se lanzará una excepción si no se recibe un argumento denominado color. Y si no recibe uno denominado times le asignará a éste el valor 1. Una forma habitual de tratar esto es:
try:
i = web.input('foo', bar=2)
except KeyError:
return web.badrequest()
Con esto hemos acabado el tutorial por ahora. En la siguiente entrega: form.py.