Tutorial de Webpy
Tutorial de Webpy
3
Si conoces Python y quieres crear un sitio web. web.py provee el cdigo para construirlo de manera fcil. Si deseas completar el tutorial, necesitas tener instalado Python, web.py, flup, psycopg2 y Postgres (o la base de datos y la librera de Python equivalente). Para mas detalles, vea webpy.org. Si tienes un proyecto de web.py existente, hecha un vistazo a la pgina upgrade para obtener informacin sobre la migracin.
Comencemos.
La parte ms importante de cualquier sitio web es la estructura URL. Las URLs no son solo eso que los visitantes ven y envan por correo a sus amistades, ellos tambin proveen un modelo mental de cmo nuestro sitio web trabaja. En sitios populares como del.icio.us, las URL son siempre parte de las interfaces de usuario. web.py facilita la creacin de URL grandes. Para iniciar con nuestra aplicacin web.py, abra un archivo de texto nuevo
(llammosle codigo.py): import web
Con esto importamos el modulo web.py. Ahora necesitamos decirle a web.py cual es nuestra estructura URL. Vamos a iniciar con algo simple:
urls = ( /, index )
La primera parte es una expresin regular que machea la URL, como /, /help/faq, /tem/(\d+), etc. (o sea que \d+ debera machear con una secuencia de dgitos). Los parntesis capturan los datos que machearon para ser usados mas tarde. La segunda parte es el nombre de la clase a la que se enva la peticin, como index, view, bienvenidos.hola (la clase hola del mdulo bienvenidos), o get_\1. \1 es remplazada por la primera captura de la expresin regular; cualquier captura encontrada es pasada a nuestra funcin. Esta lnea dice que queremos la URL / (o sea la primera pgina) para ser manipulada por la clase nombrada index.
Ahora necesitamos crear una aplicacin pasando como parmetro la variable urls.
Dicindole a web.py que cree una aplicacin con las URLs que escribimos anteriormente, buscando las clases en el espacio de nombre de ese fichero.
La funcin GET ser llamada por web.py en cualquier momento creando un pedido GET para /. Bien, ahora nosotros necesitamos terminar con una lnea final dicindole a web.py que comience a servir las pginas web.
if __name__ == __main__:app.run()
Dicindole a web.py que sirva la aplicacin que creamos anteriormente. Ahora note que aunque he estado hablando mucho aqu, nosotros solo tenemos realmente cinco o ms lneas de cdigo. Eso es todo lo que necesitas para crear una aplicacin de web.py completa.
Inicia el servidor
Si vas al intrprete de comando y tecleas:
$ python codigo.py http://0.0.0.0:8080/
Tendrs la aplicacin web.py corriendo en un servidor web real en la computadora. Visita la URL y deberas ver lo siguiente Hola, mundo! (Puedes agregar tu propia direccin IP/puerto en el momento en que es lanzado el servidor web.py. Tambin puedes decirle si correr un servidor fastcgi o scgi.) Nota: Si no quieres o no puedes usar el puerto que es activado por defecto Puedes especificar el puerto a usar con la siguiente lnea de comando:
$ python codigo.py 1234
Plantillando
Escribir cdigo HTML dentro del cdigo de Python puede ser algo embarazoso; es mucho mas divertido escribir el cdigo Python dentro del HTML. Por suerte, web.py lo hace de una manera bastante fcil. Nota: Las versiones viejas de web.py usaban el sistema de plantillas Cheetah. Tu puedes, claro esta, usar este o cualquier otro software con web.py, pero este no esta oficialmente soportado. Vamos a crear un nuevo directorio para nuestras plantillas (nosotros lo llamaremos plantillas). Dentro, creamos un nuevo fichero de extensin HTML (que lo llamaremos index.html). Ahora, puedes escribir dentro cdigo HTML:
<em>Hola</em>, mundo!
O puedes usar el lenguaje del sistema de plantillas de web.py para agregar cdigo a nuestro HTML:
$def with (nombre) $if nombre: <em>Hola</em> a $nombre. $else: <em>Hola</em>, mundo!
Como puedes ver, el sistema de plantilla luce casi como un fichero Python, excepto por la sentencia def with (con la cual se llaman las variables de la plantilla) y el carcter $ que es colocado delante de cualquier variable y cdigo Python. En la actualidad las plantillas requieren que la sentencia $def sea la primera lnea del fichero. Note que en web.py las variables usadas en las plantillas escapan de manera automtica, tambin que si por alguna razn cambia el valor de la variable nombre contenida en un HTML, este escapa apropiadamente y aparece en texto plano. Para evitar esto escribe $:nombre en vez de $nombre. Ahora regresa a codigo.py y bajo la primera lnea agrega:
render = web.template.render(plantillas/)
Con esto le decimos a web.py donde encontrar las plantillas de nuestra aplicacin. Ahora cambiemos index.GET (el mtodo GET de la clase index) a:
nombre = Kmilo return render.index(nombre)
(index es el nombre de la plantilla y nombre es el argumento que le pasamos a index) Visita el sitio en el navegador y debera decir Hola a Kmilo!. Digamos que queremos permitirles a las personas pasar su propio nombre. Remplaza las dos lneas agregadas arriba con:
i = web.input(nombre=None) return render.index(i.nombre)
Visita /, debera mostrar Hola mundo! Visita /?name=Kmilo y debera decir Hola a Kmilo. Por supuesto, tener ? en la URL es algo feo. Por lo que cambiemos nuestra URL a:
/(.*),index
Ahora visitamos /Kmilo y este debera mostrar Hola a Kmilo. Si deseas aprender mas sobre las plantillas de web.py, visita la pgina referente a las plantillas.
Formularios
El modulo form de web.py permite generar formularios html, permite la entrada de usuarios y la validacin de estos antes de ser procesados o agregados a la base de datos. Si quieres aprender mas sobre como usar el modulo form de web.py, ver la Documentacin o visita el link de la Librera Form.
Base de Datos
Nota: Antes de empezar a usar la base de datos, debemos asegurarnos de tener la librera de base de datos apropiada instalada. Para las base de datos MySQL, use MySQLdb para Postgres use psycopg2. Primero necesitas crear un objeto de base de datos.
db = web.database(dbn=postgres, user=usuario, pw=contrasea, db=nombrebd)
(Ajuste estos especialmente usuario, contrasea y nombrebd para su configuracin. Los usuarios de MySQL deben cambiar el parmetro de dbn a mysql.) Esto es todo lo que necesitas hacer web.py manipula automticamente las conexiones y desconexiones de la base de datos. Usando la interfaz de administracin del motor de base de datos creamos una simple tabla en nuestra base de datos:
CREATE TABLE todo ( id serial primary key, titulo text, created timestamp default now(), done Boolean default f );
Y una fila:
y cambiemos la URL a:
/, index,
Visita de nuevo el sitio y deberas ver lo siguiente: Aprenda web.py. Felicidades! Haz creado una aplicacin que lee de la base de datos. Ahora vamos tambin a escribir en la base de datos. Vamos a agregar a index.html lo siguiente:
<form> <p><input type=text name=titulo /> <input type=submit value=agregar /></p> </form>
Y cambia la URL a:
/,index, /agregar,agregar
(Tienes que ser sumamente cuidadoso con las comas. Ya que si omites estas, Python agrega las cadenas juntas, algo como esto /index /agregaragregar) Ahora vamos a agregar otra clase:
(Como hacemos uso del POST?) web.input nos da acceso a cualquier variable enviada por el usuario a travs de un formulario. Nota: Para acceder a los datos de mltiples tems idnticamente nombrado, en una lista (ej.: una serie de checkbox todos con el atributo name=name) usa:
dato_post=web.input(nombre=[])
db.insert inserta valores dentro de la tabla de base de datos todo y obtienes el ID de la nueva fila. seeother redirecciona los usuarios a otra URL.
Nota adicional: db.update trabaja justo como db.insert a excepcin de que este toma un ID en vez de retornarlo (o una clausula WHERE) luego el nombre de la tabla.
web.input, db.query, y otras funciones en web.py retornan objetos Storage, que son como los diccionarios a excepcin de que puedes hacer d.foo en vez de d[foo]. Esto limpia un poco el cdigo.
Tu puedes buscar todos los detalles sobre las funciones web.py en la documentacin. Desarrollando web.py tiene algunas herramientas para ayudarte con el debugeo. Cuando corre con el built-in del servidor web, esta inicia la aplicacin en el modo debug. En este modo cualquier cambio en el cdigo y las plantillas son automticamente recargados y los mensajes de error muestran informacin til. El debug no est activado cuando la aplicacin corre en un servidor real. Si t quieres desactivar el modo debug, puedes agregar la siguiente lnea antes de crear tu aplicacin/plantillas:
web.config.debug = False
La gua termina por ahora. Eche una ojeada a la documentacin para obtener material ms fresco sobre lo que puedes hacer con web.py. Que es lo siguiente? Mas documentacin