Beruflich Dokumente
Kultur Dokumente
Los wikis estn de moda y son unas de las mejores demostraciones de la web, y ni siquiera son complicados de programar!
hora entremos en c2.com y echmosle un vistazo ya lo has visto? Entonces te habrs percatado de lo simple que es. Fue creado pensando en la simplicidad de formas, para que fuese una herramienta ms que un escaparate. El objetivo es que las personas que los visitasen fueran dejando pequeos trozos de informacin, de manera que el sistema creciese solo. c2.com tambin es muy simple en cuanto a programacin y en este nmero replicaremos gran parte del mismo con un programa en Python que no llega a las 200 lneas!! De nuevo Python nos demuestra su potencia.
Con estos ingredientes vamos a programar un wiki hecho y derecho, que podremos ampliar a nuestro antojo. NOTA: Para poder seguir el resto del artculo, convendra tener a mano el listado completo del programa wiki.py, que se puede descargar de [5].
Ninguna de ellas corresponde con nuestro patrn. Ahora vamos a ver unas cuantas que s lo hacen:
HolaMundo UnDosTres LinuxMagazine FreeBsd WikiWiki (ya os podeis imaginarU porqu se llaman WikiWiki y noU Wiki, no servira como palabraU clave ;) )
Ahora que hemos visto las palabras clave vamos a ver como se utilizan. La verdad es que no tiene mucho que explicar, simplemente las pones, es decir: Esto es un texto de un WikiWiki para LinuxMagazine. En este ejemplo tanto WikiWiki como LinuxMagazine se convertiran automticamente en palabras clave. Las pginas de wiki sern editables, de manera que cualquiera podr pulsar el botn Editar y cambiar, borrar o
WWW.LINUX- MAGAZINE.ES
Nmero 08
67
DESARROLLO Python
aadir texto a la pgina. Dentro de este proceso puede introducir palabras clave que no estn presentes en el WikiWiki. De esta manera se crean nuevas pginas. El texto que editaremos estar en formato HTML, de esta manera podremos introducir formateo, como por ejemplo listas o negritas. Una vez editada la pginas podremos guardarla, y a partir de entonces estar disponible la versin modificada. En teora no debera ser posible eliminar pginas, el objetivo del WikiWiki es acumular informacin. Como la nica manera de crear nuevas pginas es aadir palabras clave a pginas ya existentes nos aseguramos de que cualquier pgina sea accesible desde otra. No tendremos pginas sueltas.
no? POST es distinto, el navegador y el servidor se pasan informacin usando el protocolo HTTP, de manera que no veremos pasar las variables A efectos de nuestro programa, no nos importa usar GET o POST, lo que nos interesa es el concepto de CGI. Nuestro programa recoger variables y generar las pginas dependiendo de ellas Para ello usaremos el mdulo cgi de Python:
import cgi
parecidos posible a autnticos formularios burocrticos. Nuestra necesidad se cubre con un formulario que incorpore un rea de texto y un botn para guardar el texto editado. Vamos a ver lo bsico. Un formulario HTML est encerrado entre dos etiquetas <form> y </form>. La primera de ellas lleva una serie de datos que definen el comportamiento del formulario. Nosotros queremos poder controlar el mtodo de envo (POST o GET) y el programa que recibir los datos (wiki.py).
<form method="POST"U action="wiki.py"> ... </form>
Dentro del formulario se definen los controles que mostrar. Cada uno de ellos, a su vez, define una serie de parmetros. El primero de ellos ser un textarea.
... <textarea cols="55" rows="10"U name="texto"></textarea> ...
CGI
El Common Gateway Interface es un protocolo que permite a un servidor web enviar informacin y recibirla desde un programa exterior. Bsicamente el servidor web delega la generacin de las pginas en programas externos que obtienen sus parmetros de ste. Estos parmetros pueden ser enviados de dos maneras o mtodos distintos: GET y POST. Es la manera que tiene el navegador de intercambiar informacin con el servidor web remoto. GET simplemente pasa los parmetros a travs de la URL que el navegador pasa al servidor. Lo podemos ver cuando visitamos muchas pginas, la url tiene un formato parecido a http://www.algunaweb. org/algo.algo? variable1=valor1\&variable2=valor Lo que est ocurriendo es que el navegador le est pasando 2 variables al servidor ( variable1 y variable2). La URL usa el smbolo ? para separar la ruta de las variables y el smbolo \& para separar variables entre s. No es muy complicado
ste mdulo nos permite recoger las variables que nos pasa el servidor web. Para ello tenemos que usar la funcin cgi.FieldStorage(). Esta funcin nos devuelve un diccionario de objetos del tipo FieldStorage. Cada uno de ellos contiene la informacin de una de las variables. De toda esa informacin solo nos interesar el valor de la misma, que es accesible haciendo lo siguiente:
variables = cgi.U FieldStorage() valor = variables["nombre"].U value
cols indica el nmero de columnas (de un carcter de ancho) y rows el nmero de filas. El parmetro name define el nombre con el que el contenido del textarea ser enviado al servidor web, hemos escogido el poco original nombre de texto. El segundo tipo de control que necesitaremos es input:
... <input type="submit" value=U "Editar"> </input> <input type="hidden" name=U "editar" value="algo"> </input> ...
As podremos obtener el valor de la variable. Al ser un diccionario lo que devuelve, podremos preguntar si est presenta alguna variable en particular usando el mtodo has\_key(): variables.has\_key("nombre")
Formularios HTML
Parte vital del WikiWiki es el poder editar el contenido de las pginas. Para ello HTML dispone de los formularios, que nos permiten recoger informacin y enviarla al servidor web. Los formularioss HTML se componen de muchos controles como por ejemplo botones, campos de texto, etiquetas o casilleros. Se disearon para ser lo ms
Aqu vemos los dos tipos que necesitamos. El parmetro type se usa para especificar el tipo, pues existen varios diferentes. En nuestro caso tenemos: submit, que genera un botn cuyo ttulo se recoge del parmetro value. Este botn, al ser pulsado, enva los datos la servidor. Y hidden, que se usa para pasar al servidor datos no relacionados con controles. En nuestro caso pasamos la variable editar=algo.
68
Nmero 08
WWW.LINUX- MAGAZINE.ES
Python DESARROLLO
Diseo de la Aplicacin
El WikiWiki funcionar de la siguiente manera. Cuando se acceda por primera vez, al no estar presente ninguna variable, generaremos una pgina web de presentacin. Esta primera pgina tendr un botn que nos permitir editarla. Para ello incluiremos un botn dentro de un formulario html, que enviar una variable editar con la cadena WikiWiki como valor. Nuestro programa se arrancar de nuevo, pero en esta ocasin ver la variable editar y en lugar de generar una pgina, buscar en el directorio en que est la existencia de un fichero WikiWiki.txt. Si est presente cargar su contenido en un textarea que nos permitir editarlo. Vendr acompaado por un botn guardar que al ser pulsado enviar dos variables: guardar con el nombre de la pgina (WikiWiki en este caso) y texto con el texto que hemos editado. Cuando wiki.py detecte ambas variables proceder a guardar el contenido de texto en un fichero con el nombre que contenga la variable guardar concatenado con .txt. El texto, antes de ser guardado, se analiza en busca de palabras clave. En el caso de que aparezcan se realizar la siguiente transformacin en el caso de que exista la pgina (o sea, el fichero WikiWiki.txt)
....WikiWiki... en ...U <a href="wiki.py=?pagina=U WikiWiki"> WikiWiki</a>...
arla. Para ello solo tenemos que pinchar sobre las ?, rellenar el textarea y pulsar en guardar (al igual que antes). Luego podemos tendremos que controlar 4 estados: Que no vengan variables, generamos la web de bienvenida Que venga la variable pagina, y cargaremos la pgina correspondiente Que venga la variable editar, y cargaremos en modo de edicin la pgina indicada Que vengan las variables guardar y texto, y procederemos a guardar el texto que nos envan
and l.append(x) or l, a, []) siendo a la cadena, pero explicar esta simple lnea nos llevara un artculo entero). Lo que podemos hacer es emplear un poco de matemticas. Python nos permite generar un conjunto desde una lista. Un conjunto puede contener diversos elementos, pero no importa su cantidad solo si estn presentes. Vemoslo de una manera sencilla. Supongamos que tenemos la lista: [1,1,1,3,4,5,5,6] y que generamos un conjunto usando la funcin set([1,1,1,3,4,5,5,6]). El resultado ser el conjunto {1,3,4,5,6}. Python nos permite iterar sobre un conjunto, extrayendo un elemento distinto cada vez. Esto nos permite realizar el siguiente truco:
01 02 03 04 05 06 07 08 09 10 11 > > > l i s t a = [1,1,1,3,4,5,5,6] >>> conj = set(lista) >>> for elemento in conj: ... print "Elemento: ", elemento ... Elemento: 1 Elemento: 3 Elemento: 4 Elemento: 5 Elemento: 6 >>>
As que convertiremos nuestra lista de palabras en un conjunto y lo recorreremos de esta manera. Como ya tenemos las palabras solo tenemos que reemplazarlas
o se realizar la transformacin
...WikiWiki... en ...U WikiWiki <a href="wiki.py=U ?pagina=WikiWiki">?</a>...
en el caso de que no exista, para indicar con el ? que esa pgina hay que cre-
WWW.LINUX- MAGAZINE.ES
Nmero 08
69
DESARROLLO Python
Un desastre vamos, as que usaremos el conjunto. Con esto hemos visto la funcin parseaEnlaces() de nuestro WikiWiki, una funcin vital y muy til. por sus hipervnculos correspondientes. Pero, como la presentacin variar dependiendo de si la pgina ya existe o no, tendremos que comprobar con un IF esa condicin. Entonces reemplazaremos en el contenido de la pgina la palabra clave por el hipervnculo correcto. Usaremos la funcin replace() de string. replace() acepta 2 parmetros, el primero es la cadena a ser sustituida y la segunda la cadena con la que vamos a sustituir. Una sola ejecucin de replace() realizar todas las sustituciones de una vez. Esa es la razn por la que hemos realizado el truco del conjunto: si se repitiese alguna cadena en la lista de palabras claves nos ocurrira lo siguiente. Con la primera realizaramos el cambio:
...WikiWiki... -> ...U <a href="wiki.pl\$pagina=U WikiWiki">WikiWiki</a>...
Generacin de HTML
Bueno, ahora nos encargaremos de generar el HTML. Gracias a CGI la tarea consiste en realidad en imprimir el cdigo HTML usando print. El HTML devuelto por CGI tiene una peculiaridad, debe ser enviado con una etiqueta que indica el tipo de informacin que contiene. Adems, esta etiqueta tiene que ir separada por dos retornos de carro (dos intros) del resto de la pgina. La etiqueta en cuestin es:
print "Content-Type:s text/html" print print
Cada vez que tenemos que interactuar con el sistema de ficheros usamos:
def cargaPagina(titulo) def guardaPagina(titulo,texto)
ltimos Detalles
Hemos de tener en cuenta que el programa wiki.py debe tener permisos de escritura en el directorio donde se encuentre, puesto que ah ser donde deposite los ficheros. Tambin tenemos que darle permiso de ejecucin (bastar con chmod +x wiki.py) Ya slo nos queda copiar wiki.py al directorio adecuado en introducir en el navegador la URL (vara segn nuestra configuracin): http://localhost/cgi-bin/ wiki.py Aparecer una pgina como la mostrada en la Figura 4 s
Esos print sin parmetros imprimen los retornos de carro. Para facilitar el diseo del cdigo hemos dividido la generacin de la pgina en 3 funciones:
def def def def cabecera(titulo) cuerpo(titulo, texto)U editarCuerpo(titulo,texto) pie()
Pero al encontrar otra vez la palabra clave WikiWiki en la lista sustituiramos los WikiWiki recien insertados por el hipervnculo de nuevo:
...<a href="wiki.pl\$pagina=U WikiWiki">WikiWiki</a>... -> ...<a href="wiki.pl\$pagina=...U <a href="wiki.pl\$pagina=U
Se encargan de generar las pginas usando las 3 funciones anteriores. Esto simplifica mucho el cdigo y nos permite generar pginas de manera sencilla.
70
Nmero 08
WWW.LINUX- MAGAZINE.ES
LOS AUTORES
Toda pgina tendr una cabecera, que imprime la parte no visible, como las etiquetas <title>, y un pie, que cerrar la pgina HTML ( </body> </html> ). En medio estar el cuerpo, que puede ser generado por cuerpo o por editarCuerpo. Esta segunda funcin lo que presenta es un formulario para editar el contenido de una pgina. El texto de cuerpo() se genera normalmente usando una variable contenido de tipo string. Dependiendo de las circunstancias contendr una informacin u otra. Las funciones:
RECURSOS
[1] http://c2.com [2] http://en.wikipedia.org/wiki/ Ward\_Cunningham [3] http://www.python.org [4] http://cgi.resourceindex.com/ [5] Descarga del Listado: http://www. linux-magazine.es/Magazine/ Downloads/08
Jos Pedro Orantes Casado cursa 3 de Ingeniera Tcnica en Informtica de Sistemas y desde hace varios aos utiliza linux como herramienta de trabajo y como sistema de escritorio. Jose Mara Ruz est realizando el Proyecto Fn de Carrera de Ingeniera Tcnica en Informtica de Sistemas y lleva mas de 7 aos usando y desarrollando Software Libre, y desde hace 2 en FreeBSD