8.3. Python
8.3.1. Características del lenguaje Python
Fecha de aparición: 1991
Perspectivas:
- Uso creciente.
- Es el sustituto natural de Perl para el desarrollo rápido de scripts.
- También usado en grandes proyectos como alternativa a PHP.
- Menos extendido que PHP, pero comunidad con muchos desarrolladores profesionales (mejor relación señal/ruido)
- Muchas bibliotecas de terceros → flexibilidad
Filosofía:
- Es la versión “limpia” de Perl. Pensado para escribir scripts de forma rápida y limpia.
- Énfasis en la legibilidad: Python es casi pseudocódigo (código “pythonico” → v. “El Zen de Python”)
- Interpretado. Tipado dinámico. Fuertemente tipado.
- Expresiones regulares heredadas de Perl.
- Multiparadigma: imperativo, O.O., funcional.
8.3.2. Configuración necesaria en el servidor
Para hacer funcionar Python en un servidor Apache o similar, es necesario:
- Instalar el intérprete Python (/usr/bin/python). El más extendido es CPhyton.
- Activar los módulos python y/o cgi de Apache y configurar el handler de Apache para CGI.
- Instalar módulos adicionales (p. ej: para acceso a bases de datos) si es necesario.
Python puede funcionar de forma nativa integrado en Apache o a través de CGI. Lo primero es más rápido; lo segundo, más frecuente.
8.3.3. Sintaxis básica de Python
Las variables en Python no se declaran obligatoriamente: tienen tipado dinámico y son locales por defecto.
varariable = valor;
print "La variable var vale %s" (variable);
En Python hay muchos tipos de datos complejos predefinidos: listas, tuplas, diccionarios…
Algunos operadores son:
- Comparación: <, >, <=, >=, ==, !=
- Asignación: =
Y estas son algunas estructuras de control. ¡Cuidado! ¡El código debe indentarse OBLIGATORIAMENTE! No existen las llaves ({ y }) en Python. ¡La indentación (o sangrado) marca los bloques!
while condicion:
Acciones
if condicion:
Acciones-1
else:
Acciones-2
8.3.4. Entrada / Salida
La entrada de datos por teclado puede hacerse con raw_input():
variable = raw_input("Texto")
Pero a nosotros nos interesa hacer entrada de datos a través de un formulario HTML. Esto se hace así:
import cgi
form = cgi.FieldStorage()
campo = form["campo"].value
En cuanto a la salida de datos, se usa print con cadenas de formato, seguida de una lista de variables. Cada elemento de la cadena de formato marcado con un % se sustituirá por una variable de la lista, en el mismo orden en el que estén escritas. Por ejemplo:
print "cadena %s cadena %s ..." (variable1, variable2)
El símbolo %s significa que en esa posición irá un String. Otras posibilidades son %d (enteros) o %f (float). Esta forma de especificar las cadenas de formato está directamente tomada del lenguaje C.
En Python existen muchas otras formas de hacer una salida de datos, pero print es lo suficientemente potente como para que puedas utilizarla para cualquier cosa imaginable en una aplicación web.
8.3.5. Bibliotecas, funciones y clases
En Python hay tres niveles de agrupación de bibliotecas:
- Módulos: un módulo es un fichero con código Python en su interior. Puede ser una clase o un puñado de funciones sueltas, por ejemplo.
- Paquetes (packages): un paquete es un directorio que contiene varios módulos. También puede contener subpaquetes. Los paquetes se instalan y desinstalan con un gestor de paquetes (como pip, que viene a ser como composer en PHP).
- Bibliotecas (libraries): una biblioteca es cualquier fragmento de código reutilizable que se puede incluir en otros proyectos. Las bibliotecas pueden ser paquetes o no. Existe una Python Standard Library que contiene todas las funciones básicas de Python y viene preinstalada con el core del lenguaje.
Podemos incluir una librería en nuestro proyecto Python usando la palabra import:
import mi-librería
Como hemos dicho, dentro de cada módulo puede haber clases o subrutinas sueltas. Una subrutina (procedimiento o función) se declara así en Python (observa de nuevo como la indentación o sangrado es fundamental porque marca el comienzo y final de los bloques de código):
def mi-funcion(param1, param2, etc):
# Aquí va el código de la función
[return valor1, varlor2...]
En cuanto a las clases, la sintaxis para declararlas y muy similar a PHP, Java o C++ (recordando que, en Python, no se usan las llaves sino la indentación):
class MyClass:
un_atributo = valor
otro_atributo = valor
# Esto es un constructor
def __init__(self):
self.un_atributo = 0
def un_metodo(parámetros):
return lo_que_sea
8.3.6. Ejemplo 1 en Python: Hola mundo
#!/usr/bin/python
print "Content-type: text/html\n\n"
print "<html><body>"
print "<h1>Hola, mundo</h1>"
print "</body></html>"
8.3.7. Ejemplo 2 en Python: login con comprobación de email por Ajax
Repetimos ahora el ejemplo del login con comprobación de usuario y contraseña mediante Ajax, pero no mostraremos de nuevo el código del formulario ni de la llamada Ajax. Para ver ese código, revisa la sección que dedicamos al lenguaje Perl. Allí solo tendrás que cambiar el nombre del script (login.pl) por login.py.
El código de ese script sí que cambia, claro. Esta es la versión del mismo escrita en Python:
#!/usr/bin/python
import cgi
import MySQLdb
# Capturamos los valores del formulario
form = cgi.FieldStorage()
usuario = form["username"].value;
password = form["password"].value;
print "Usuario = ", usuario, " Pass = ", password
# Lanzamos la consulta contra la base de datos
db=MySQLdb.connect(host='localhost', user='yo-que-sé', passwd='vete-a-saber', db='lo-que-sea')
cursor=db.cursor()
num_rows = cursor.execute("SELECT id FROM users WHERE username = '%s' AND password = '%s';", (usuario, password))
userid = cursor.fetchone()
# Devolvemos el resultado en JSON
print "Content-type: application/json\n"
if num_rows == 0:
print "{'error': 'Usuario o contraseña incorrectos'}"
else:
print "{'success': 'El usuario y la contraseña son válidos', 'userid': '%d'", userid