Desarrollo web con Python y Web.py – parte 4

Antes de adentrarnos en el manejo de bases de datos, es necesario estar seguros de que contamos con las librerías apropiadas para hacerlo.

Postgres: Necesitamos Psycopg2.
MySQL: Necesitamos MySQLdb.

En este apartado usaremos PostgreSQL y Psycopg2. Para instalar PostgreSQL y psycopg2 podes apoyarte en el administrador de paquetes de tu distro si estás en GNU/Linux o mirar la guía de “Cómo Instalar y configurar PostgreSQL en Debian” o “Instalar PostgreSQL desde Las fuentes en Linux”. Para comprobar si tenemos la librería psycopg2 instaladas, podés usar el CLI de Python:

 >>> import psycopg2
 >>> psycopg2.__version__
 '2.2.1 (dt dec mx ext pq3)'
 >>>

Creando nuestra Base de Datos.

Para desarrollar nuestro capítulo de databasing, necesitamos crear una base de datos en nuetro SGBD.

A. Creando una Base de Datos en Postgres:

 # su - postgres
 $ psql
 postgres=# CREATE DATABASE myweb owner=postgres encoding='utf-8';
 CREATE DATABASE
 postgres=#

B. Creamos una simple tabla en nuestra base de datos:

 postgres=# \c myweb
 myweb=# CREATE TABLE todo (
 id serial primary key, title text,
 created timestamp default now(), done boolean default 'f');
 NOTICE:  CREATE TABLE creará una secuencia implícita «todo_id_seq» para la columna serial «todo.id»
 NOTICE:  CREATE TABLE / PRIMARY KEY creará el índice implícito «todo_pkey» para la tabla «todo»
 CREATE TABLE
 myweb=# \d
 Listado de relaciones
 Esquema |   Nombre    |   Tipo    |  Dueño
 ---------+-------------+-----------+----------
 public  | todo        | tabla     | postgres
 public  | todo_id_seq | secuencia | postgres
 (2 filas)
 myweb=#

C. Agregamos una fila a nuestra tabla:

 myweb=# INSERT INTO todo (title) VALUES ('Aprender Web.py');
 myweb=# SELECT * from todo;
 id |      title      |          created           | done
 ----+-----------------+----------------------------+------
 1 | Aprender Web.py | 2011-11-06 08:42:20.366723 | f
 (1 fila)

D. Modificamos la contraseña para el usuario postgres:

postgres=# ALTER USER postgres WITH ENCRYPTED PASSWORD 'qwerty';

Conectando Web.py con la Base de Datos.

Para que web.py se conecte con la base de datos que acabamos de crear, solo es necesario crear un objeto database. Así:

dB = web.database(dbn='postgres', user='usuario', pw='contraseña', db='dbname')

dbn: nombre SGBD.
user: usuario de la base de datos.
pw: contraseña del usuario de la base de datos.
db: Nombre de la Base de datos.

Testeando que la conexión funcione.

 >>> import web
 >>> dB = web.database(dbn='postgres', user='postgres', pw='qwerty', db='myweb')
 >>> dB.select('todo')
 0.04 (1): SELECT * FROM todo
 <web.utils.IterBetter instance at 0x8d4d96c>
 >>>

Si tenemos un error de autenticación, debes modificar la autenticación de “ident” a “md5” en el fichero pg_hba.conf de postgreSQL y recordar haber cambiado la contraseña de nuestro usuario postgres.

Creando un pequeño manejador de bases de datos en Web.py.

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 #
 4
 5 import web
 6
 7 # Templates
 8 rend = web.template.render('templates')
 9
 10 # URL's
 11 urls = (
 12     '/', 'index',
 13 )
 14
 15 # Database
 16 dB = web.database(dbn='postgres', user='postgres', pw='qwerty', db='myweb')
 17
 18 # App
 19 app = web.application(urls, globals())
 20
 21
 22 class index:
 23     def GET(self):
 24         todos = dB.select('todo')
 25         return rend.index(todos)
 26
 27
 28 if __name__ == "__main__": app.run()
 29

Creamos la plantilla index.html.

 1 $def with (todos)
 2 <ul>
 3 $for todo in todos:
 4     <li id="t$todo.id">$todo.title</li>
 5 </ul>
 6

Creo que explicar este código sobra ya que todo debe estar más que claro. Ejecutamos nuestro pequeño manejador de DB.

Agregando datos a nuestra Base de Datos.

Ahora solo nos falta poder ingresar datos a la base de datos. Para eso creamos una URL para ingresar datos (puede ser “add“).

 10 # URL's
 11 urls = (
 12     '/', 'index',
 13     '/add', 'add'
 14 )

Al final de nuestro index.html creamos un pequeño formulario para enviar datos al servidor:

 7 <form method="post" action="add">
 8 <p><input type="text" name="title" /></p>
 9 <input type="submit" value="Agregar" />
 10 </form>
 11

Agreguemos nuestra clase para manejar la url /add.

 28 class add:
 29     def POST(self):
 30         i = web.input()
 31         n = dB.insert('todo', title = i.title)
 32         raise web.seeother('/')
 33

Note que hemos usado el método POST para enviar datos a la base de datos.

Si ejecutamos nuestro pequeño manejador de bases de datos en web.py.



web.input(): le da acceso a todas las variables enviadas por el usuario a través de un formulario.
dB.insert: inserta los valores en la base de datos “todo” y devuelve el ID de la nueva fila.
web.seeother: redirige a los usuarios a la URL indicada.

Notas Adicionales:
Para poder acceder a los datos de varios elementos de idéntico nombre, de un formulario. Por ejemplo: una serie de check-boxes todos con el atributo name=”name”. usar un formarto de lista “post_data = web.input(name[])“.
dB.update: db.update funciona igual que db.insert pero en lugar de devolver la ID que se necesita (o una cadena de cláusula WHERE) después de el nombre de la tabla.
web.input, dB.query, y otras funciones en web.py retornan “Objetos de almacenamiento” que son como los diccionarios, excepto que usted haga d.foo además de d[‘foo’]. Esto realmente hace un código más limpio.

Web.py en Producción.

Web.py cuenta con herramientas que ayudan en la depuración. Cuando corres el servidor interno de web.py, esto arranca la aplicación en modo depuración. En el modo depuración cualquier cambio al código y las plantillas son automáticamente cargados así como los mensajes de error; Algo que no quisiéramos en nuestro servidor de producción.

Si querés deshabilitar el modo de depuración, vos podes agregar la siguiente línea antes de crear tu aplicación/plantillas:

web.config.debug = False

Author: Jolth

Anuncios

12 pensamientos en “Desarrollo web con Python y Web.py – parte 4

  1. Muy bueno y me sirve de mucha ayuda, puesto que me parece que herramientas como django o web2py, son interesantes pero la curva de aprendizaje es alta, por lo tanto me encanta webpy, porque tomas exactamente lo que necesitas.

  2. ¡Estupenda pagina, Felicitaciones! Voy a iniciar un proyecto web con manejo de Datos utilizando postgresql. El proyecto tiene que ver con un control de la planificación empresarial de sucursales bajo el paradigma del Cuadro de Mando. He estado estudiando varios framework como: web2py, turbogears y play for scala y despues de leer tu Blog, me parece que la mejor alternativa es Web.py. Digo esto porque en corto tiempo he visto como desarrollas en tu Blog varios temas como conexión a bases de datos, utilización de Templates, Formularios, CSS con bootstrap, etc. con mucha claridad y pienso que será de mucha ayuda. Lo estare molestando en los próximos dias.

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