Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Script Python de paso de <title> a propiedad o atributo ZOPE

Última Actualización: 17 de Enero de 2003 - Viernes

Continuando con la migración de mi web de un HTTP tradicional como es Apache a ZOPE, otra cosa interesante que destaca en esta aplicación es el uso de "propiedades" en los documentos. Esto es muy interesante para, por ejemplo, estructurar los documentos HTML y darle un sentido semántico más completo, a nivel de programación. Por ejemplo, en vez de tratar la página HTML como un contenido indiferenciado, se pueden definir secciones, como "título", "resumen", "historia" o "enlaces". A la hora de visualizar el documentos, las diferentes secciones se concatenan, pero se pueden procesas y tratar de forma separada.

Por ejemplo, se puede definir un "título" y un "resumen" para cada documento, y mostrar esa información como resultado de una búsqueda a través de ZCatalog.

Realizar resúmenes de los cientos de archivos HTML que tengo en mi web sería una tarea ingrata. Pero, al menos, se puede extraer el título de cada uno de ellos de forma simple, gracias al reconocimiento de la etiqueta <title>.

En mi web todas las páginas HTML usan la etiqueta <title>, de forma muy disciplinada. Todos los títulos, por ejemplo, están contenidos en una única línea de texto, aunque ésta sea larga. Estas propiedades me permiten automatizar la tarea.

Puedo recorrer el árbol de objetos ZOPE de forma recursiva y extraer el título de cada documento de forma automatizada. Ese título lo meteremos en la propiedad "title" de ese objeto, estándar en ZOPE. Además, para mantener cierta consistencia, reemplazamos el título del documento, en el HTML, por una etiqueta DTML, <dtml-var title>, que lo lea de la propiedad correspondiente.

El script Python es el siguiente:

def transforma(cadena) :
  a=cadena.find("<title>")
  b=cadena.find("</title>")
  if (a==-1) or (b==-1) : return None,None
  c=cadena[a+7:b]
  if c=="<dtml-var title>" : return None,None
  cadena=cadena[:a+7]+"<dtml-var title>"+cadena[b:]
  return c,cadena

def arbol(obj) :
  a=[]
  for i in obj.objectValues() :
    id=i.getId()
    m=i.meta_type
    if (not i.title) and (m=="DTML Document") and (id[-4:]==".htm") : a.append(i)
    if (m=="Folder") and (id!="temp_folder") : a.extend(arbol(i))
  return a

print "Moviendo el <title> a una propiedad..."
for i in arbol(context) :
  title,texto=transforma(i.raw)
  if title :
    print i.getId()
    i.manage_edit(texto,title)

print "Operación completada."

return printed

Sería interesante, para webs muy grandes, ir realizando transacciones granulares, en vez de una única transacción al terminar la conversión. Eso es importante para reducir la ocupación de memoria durante el proceso, ya que los objetos modificados durante una transacción son conservados en RAM hasta que la transacción se compromete. Pero no tenemos acceso a esas capacidades desde un script Python normal, sin realizar una configuración especial. Y, en el caso de mi web, esto no es un problema.

En todo caso se puede realizar también traducciones parciales, de directorios individuales, mediante los mecanismos de adquisición de ZOPE.

El script visualizará los documentos sobre los que se ha realizado alguna modificación. Los objetos no modificados no consumen memoria RAM, así que se puede lanzar el script de forma periódica, sobre sitios web muy grandes.

Un último detalle importante a recordar son los permisos. El script, típicamente, se ejecutará con los permisos del usuario que lo invoca. Si el script es accesible por usuarios "anónimos", cualquiera puede lanzarlo. Ello no es un problema de seguridad, porque cuando el script intente modificar un objeto ZOPE, lo hará con los permisos de usuario anónimo, y fallará. Pero aunque no haya que modificar objetos, se realiza el recorrido recursivo, lo que puede ser un proceso lento que consume muchos recursos.

La solución, evidente, es dar permiso de ejecución de este script, exclusivamente, a usuarios de confianza. E, incluso, limitarlo al "manager".



Python Zope ©2003 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS