Python es un lenguaje que cada vez recibe más atención, es versátil y poderoso, con un gran soporte hacia la programación orientada a objetos (POO) y quizás posea la sintaxis más limpia del mundo, en constrate a la de Perl que posee una sintaxis (en mi opinión) mal diseñada. Sin embargo, el gran obstáculo al acercarnos a Python es la pobre documentación que existe acerca de él, es como como aquella navidad en la que recibimos una fabulosa autopista eléctrica pero las instrucciones de armado y uso no aparecieron por ningún lado ;-).
Este mini-HOWTO explica como conectar un script CGI de Python con Postgresql usando la interface Psycopg y el módulo CGI de Python. La configuración de de Postgresql, la creación de la base de datos y la tabla de pruebas, es idéntica a la que ya revisamos al conectar
PostgreSQl con Perl∞ asi que no la repetiré aquí. También supongo que Apache está arriba y trabajando. No importa si estamos usando Apache o Apache-perl, ambos trabajan con Python perfectamente. Bien, instalemos Python y Psycopg:
# apt-get install python2.3-psycopg
Como usuario del Webserver (nobody, www-data) creamos el directorio python:
webserveruser$ mkdir /var/www/python
Como root creamos el archivo pycgi.conf en /etc/apache:
# mc -e /etc/apache/pycgi.conf
Adentro debemos poner:
Alias /python/ /var/www/python/
<Directory /var/www/python>
AllowOverride All
AddHandler cgi-script .py
Options ExecCGI Includes FollowSymlinks
Order Allow,Deny
Allow from All
</Directory>
Y al final del /etc/apache/httpd.conf:
# CGI para Python
Include /etc/apache/pycgi.conf
Reiniciamos apache:
# /etc/init.d/apache restart
Como usuario del webserver creamos el archivo pgsql.py:
wwsuer$ mc -e /var/www/python/pgsql.py
El
archivo python∞ debe contener la siguientes líneas:
#!/usr/bin/python
import cgitb; cgitb.enable();
import sys
import cgi
import psycopg
dsn = "dbname=DBTEST host=localhost port=5432 user=postgres password=mex3004"
con = psycopg.connect(dsn)
cur = con.cursor()
s = "SELECT * FROM tb_usuarios"
# Dile al navegador el tipo de contenido
print "Content-Type: text/html\n\n"
# Pinta la cabeza html
print "<HTML><HEAD>---<TITLE>Python con Postgresql</TITLE>---</HEAD><BODY>"
print "<table with='100%' align='center'>"
PYGS = "Hola Python y Postgresql!! (psycopg)"
print "<tr><td colspan='4'> Saludos " + PYGS + "</td></tr>" # pinta un saludo ñoño
form=cgi.FieldStorage() #preparo la toma de variables de ambiente get o post
if not form.getvalue("b"):
valb = "no hay valor"
else:
valb = form.getvalue("b")
if not form.getvalue("a"):
vala = "no hay valor"
else:
vala = form.getvalue("a")
print "%s -- %s" % (vala, valb)
cur.execute(s)
r = cur.fetchone()
while r != None:------ID = int(r[0])
nombre = str(r[1])
email = str(r[2])
# print cada renglón
print "<tr><td><a href='editar.py?id=%s&action=1'>Editar</a></td><td> %s | %s </td><td><a href='editar.py?id=%s&action=2'>Borrar</a></td></tr>" % (ID, nombre, email, ID)
r = cur.fetchone()
print "</table>"
# limpio el cursor
cur.close()
# cierro la conexion
con.close()
# termina SQL.
print "</BODY></HTML>" # termina html
# fin del archivo pgsql.py
Damos permisos de ejecución a este archivo:
webserveruser$ chmod 744 /var/www/python/pgsql.py
Nos colocamos con mozilla en
http://localhost/python/pgsql.py∞ y abracadabra!! nos mostrará la tabla tb_usuarios de la base de datos DBTEST. La función form.getvalue("b") toma la variable b que el enviamos por get en el URL, por ejemplo, si ponemos en mozilla:
http://localhost/python/pgsql.py?b=python-y-pgsql&a=Hello--∞-
pintara python-y-pgsql y Hello en lugar de "sin valor" en la variable b y a. Para borrar o actualizar un registro de la tabla sólo debemes crear un script editar.py que tome las variables id y action que enviamos por el URL y si action=1 actualizamos y si action=2 borramos.
Y eso es todo, sólo nos queda recordar que en python la identación es esencial.