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.
Excelente, me gustaría ver algún articulo pero ahora utilizando algún framework como Django