oscarmlage oscarmlage

Pyramid: 5 - Views y Chameleon Templates

Written by oscarmlage on

Siguiendo con esta serie de artículos sobre Pyramid y ZODB ya hemos escrito nuestros primeros modelos, así que ya podemos interactuar con ellos de alguna forma: a través de las views.

Las views o vistas en el patrón MVT (no confundir con el mismo término "vista" del patrón MVC), son las que albergan la lógica de la aplicación (lo equivalente al "controlador" en MVC). Por un lado conectan con el model y por otro lado con las templates para cerrar el proceso request/response.

Vamos a ver un ejemplo de view sencilla, que pasa un par de variables a template:

# -*- coding: utf-8 -*-

from pyramid.view import view_config
from src.models.rootfolder import RootFolder

BASE_TMPL = 'src:templates/'

@view_config(context=RootFolder, renderer=BASE_TMPL + 'index.pt')
def homepage(context, request):

    return {'title': 'PyTwitter',
            'description': 'Our twitter clon, with Pyramid'}

Definimos este método en el contexto RootFolder, si recordamos, en la entrada anterior hemos configurado para que el punto de entrada a nuestra aplicación sea RootFolder, de forma que esta view que hemos escrito será la principal de la aplicación.

Además estamos llamando al template index.pt y le hemos pasado dos variables, title y description. A continuación creamos el fichero index.pt dentro de nuestro directorio templates/ con el siguiente contenido:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal">
<head>
  <title>${title}</title>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
  <meta name="description" content="${description}" /></head>
    <body>
      <h1>${title}</h1>
      <p>${description}</p>
    </body>
</html>

Vemos como el uso de las variables que se pasan de view a template es muy sencillo. En Pyramid tenemos (por defecto) plantillas basadas en Mako o en Chameleon. A partir de la versión 1.5 debemos configurar en el método main() cual de los dos vamos a usar.

def main(global_config, **settings):
    config = Configurator(root_factory=root_factory, settings=settings)
    config.include('pyramid_chameleon')
    ...

Personalmente prefiero Mako, que es el que usan sitios como Python.org o reddit.com, se parece más a Jiinja, Twig o a las plantillas de Django, que ya conocemos bastante. Así que por probar algo nuevo vamos a utilizar Chameleon.

Remito, para más información, a la documentación oficial de Chameleon, pues escapa del objetivo de esta serie de artículos hablar de un motor de plantillas u otro.

Hasta aquí hemos creado ya lo que será la base de nuestra aplicación: model, view y template. A partir de ahora intentaremos introducir más elementos como manejo de formularios, assets, tests y otros pequeños trucos que harán más sencillo tanto la programación como el mantenimiento de nuestras aplicaciones.