Para empezar a jugar con la mini-aplicación que comenté en el post anterior, me he dedicado a instalar en casa Apache en ubuntu, y luego el módulo de Python.
Lo de Apache sin problemas. Usé el gestor de paquetes de synaptic, busqué apache2 para marcar el servidor Apache y busqué "apache2 python", para el mod de Apache/Python. La instalación sin problemas.
Python viene instalado en ubuntu y MySQL ya lo tenía.
El módulo de Apache/python parece que se carga el solito en la configuración de Apache. El fichero /etc/apache2/apache2.conf hace un include de /etc/apache2/mods-enabled/*.load y ahí dentro está el fichero mod-python.load que se encarga de cargar el módulo.
En el fichero /etc/apache2/apache2.conf añadí al final unas líneas para indicar en qué directorios estarán mis programas python y que Apache sepa redirigir las peticiones al sitio adecuado. Según veo en la ayuda, hay dos posibles formas de hacerlo. Una consiste en indicar un directorio y un handler en python que nos hagamos a medida. La otra opción, que yo he usado, es poner un handler por defecto. Las líneas añadidas al final del fichero apache2.conf son
<Directory /var/www/python>
SetHandler mod_python
PythonHandler mod_python.publisher
</Directory>
De esta forma, cualquier petición a http://localhost/python/cosa se traduce en la llamada a la función cosa() dentro del fichero index.py. También, si tenemos un fichero kk.py con una función hola(), se puede poner http://localhost/python/kk.py/hola. Si simplemente ponemos http://localhost/python/, buscará un index.py y dentro la función index().
Esto es algo que me ha llamado mucho la atención. De php, jsp o html estoy acostumbrado a llamar desde la url directamente a un fichero .php, .jsp o .html. Aquí se llama a la función de dentro del fichero.
Las funciones que ponemos en python reciben un parámetro req. Este es un objeto que contiene la información de la petición hecha por el cliente -ip del cliente, uri pedida, etc- y que a su vez se usa para devolver los resultados al cliente. Algo típico podría ser esto
def funcion(req):
req.content_type = "text/html"
req.write("<html><head></head><body><p>hola mundo</p></body></html>")
Una vez vistos los rudimentos de cómo va esto y sin tener ni pajolera idea de python, me decidí a intentar conectarme a la base de datos de mysql. Un copy-paste de código encontrado por internet me da esto
def db(req):
try:
import MySQLdb
db=MySQLdb.connect(host=’localhost’,user=’el_user’, passwd=’la_passwd’,db=’la_bd’)
cursor=db.cursor()
sql=’Select * From tabla’
cursor.execute(sql)
resultado=cursor.fetchall()
req.content_type="text/html"
req.write(’Datos de la tabla<br>’)
for registro in resultado:
#suponemos tres campos, uno numerico y dos string
#el numerico necesita conversion a string str(…)
req.write(str(registro[0])+’,'+registro[1]+’,'+registro[2]+’<br>’)
req.write(”)
except:
return ‘error’
y listo, funcionó tras algunas pruebas y cambios. El return "error" del final es en caso de excepción. Ese texto se mostrará en el navegador tal cual.
Ahora sólo me queda empollar un poco de python.