Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Look up keyword
Like this
10Activity
0 of .
Results for:
No results containing your search query
P. 1
Pyramid

Pyramid

Ratings: (0)|Views: 17,206 |Likes:
Published by Aprender Libre
El framework que no fue construido por alienígenas
El framework que no fue construido por alienígenas

More info:

Published by: Aprender Libre on Jun 12, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

11/09/2013

pdf

text

original

 
Python: Pyramid
DESARROLLO
49
Número 75
WWW.LINUX
-
MAGAZINE.ES
D
jango es el framework que más estácontribuyendo a la extensión deluso de Python. Al igual que ocurriócon Ruby y Ruby on Rails, Django se haconvertido en una gran baza para la comu-nidad Python y la excusa perfecta para pro-bar Python. Está bien documentado, dis-pone de gran número de extensiones y elrespaldo de grandes empresas ¿por qué que-rría alguien crear un competidor?La comunidad Python dista mucho de sermonolítica, aparecen múltiples alternativaspara casi todo. Lo curioso es que el novatoen los frameworks web ¡es Django! Antesde su aparición ya existían otros distintos, yPyramid es el descendiente directo de algu-nos de ellos [1].
Un “hola mundo” Minimalista
Podemos instalar Pyramid de muchas for-mas, pero la más cómoda desde el punto devista de Python consiste en crear un virtua-lenv e instalar en su interior Pyramid:
$ virtualenv --no-site-packages
--distribute pruebas-pyramid$ cd pruebas-pyramid$ source bin/activate(pruebas-pyramid)$ pip
install pyramid
Con estos cuatro pasos dispondremos de unvirtualenv con las librerías que Pyramidnecesita para funcionar. Es posible crear unproyecto Pyramid con el comando
 paster 
(un proyecto como los que creamos conDjango), pero como vamos a crear una pri-mera aplicación minimalista, sólo necesita-mos en principio un fichero con el conte-nido que aparece en el Listado 1.A diferencia de Django, Pyramid es unsistema bastante estructurado y centrado encomponentes. La configuración se efectúa através de una instancia de
Configurator 
,donde vamos añadiendo rutas, vistas y(como ya veremos) muchos otros tipos decomponentes.
Configurator 
es la base sobrela que montamos nuestro sitio web.El concepto de vista es sencillo, al igualque en Django, pudiendo usarse una fun-ción cualquiera que admita como paráme-tro un objeto
 Request 
con la información dela petición. Se distingue entre declarar unavista y emplearla en distintas rutas. Cadaruta tiene un nombre,
route_name
, que nospermite conectarla con cualquier ruta. Así,los métodos
add_route
y
add_view
trabajanconjuntamente para definir el comporta-miento de la web.Una vez hemos acabado con laconfiguración podemos arrancar el servidor.Para este sencillo ejemplo hacemos uso dela función
serve()
de
 paste
, que implementaun servidor web en Python que aceptacomo parámetro una aplicación
WSGI 
, queobtenemos llamando a
make_wsgi_app()
de
Configurator 
.Las rutas pueden contener parámetros ensu interior que podemos capturar de distin-tas formas, como ya veremos.Para poder arrancar el servidor sólo tene-mos que ejecutar el fichero como un pro-grama Python cualquiera e ir a la dirección
127.0.0.1:8080
.
Creando un Proyecto
La generación de código fuente, el llamado«scaffolding», es, a día de hoy, un elementoindispensable de la mayoría de los frame-works web. Pyramid no provee directa-mente un sistema de scaffolding, lo que iríaen contra de su política de reutilización. Enlugar de ello hace uso de
 paster 
, un sistemaindependiente de scaffolding que compar-ten otros proyectos. Cuando instalamosPyramid con
 pip
se instaló
 paster 
comodependencia, por lo que podemos usarlodirectamente:
$paster create --list-templatesAvailable templates:basic_package: A basic
setuptools-enabledpackagepaste_deploy: A web application
deployed through paste.deploypyramid_alchemy: pyramid
SQLAlchemy project using traversalpyramid_jinja2_starter:
pyramid jinja2 starter projectpyramid_routesalchemy:
pyramid SQLAlchemy project using
urldispatch (no traversal)pyramid_starter:pyramid starter
projectpyramid_zodb:
pyramid ZODB starter project
Con la opción
--list-templates
podemos verlos proyectos que
 paster 
puede generar.Pyramid nos ofrece varias alternativas,desde la más tradicional, empleando
routes
y
sqlalchemy
, hasta otras más exóticas here-dadas de Zope, como
 pyramid_zodb
o
 pyra-mid_alchemy
. La diferencia entre ambasposibilidades está en la forma en que seestructuran las urls y en la base de datos ausar.Zope permite el uso de un sistema llamado
traversal
que genera automáticamente lasurls empleando para ello las relaciones entrelos modelos de datos usados. La mayoría deframeworks web, en casi todos los lenguajesde programación, se decantan en su lugar porla definición de las urls de forma explícita,para así tener más control sobre ellas.Nosotros nos conformaremos con el enfo-que tradicional, por lo que podemos crear elproyecto con:
Uno de los rivales de peso de Django está creciendo en popularidadpoco a poco.
POR JOSÉ MARÍA RUÍZ
 
El framework que no fue construido por alienígenas
Pyramid
  m  o  r  g   u  e  f   i   l  e .  c  o  m
 
DESARROLLO
Python: Pyramid
50
Número 75
WWW.LINUX
-
MAGAZINE.ES
Python, en Pyra-mid decidieronoptar por seguirusando ficherosde configuración
.ini
.Una vez hayafinalizado el pro-ceso podemosarrancar el servidorweb con
 paster 
:
$ paster serve
development.ini
Podemos ver lapágina generada en la ruta
http://local-host:6543
Esta página incluye a la derechauna pestaña que nos da acceso al
develop-ment toolbar 
de Pyramid, que nos proporcio-nará información muy valiosa durante eldesarrollo de la aplicación, así como enlacesa la documentación de Pyramid.
Renderers, Vistas y Plantillas
Pyramid permite configurar diferentes
rende-rers
que pueden convivir en el mismo pro-yecto. Por ejemplo, podemos configurarvarios sistemas de plantillas a la vez (Mako,Chamaleon, Jinja2,…) y hacer que Pyramidseleccione el correcto basándose en la exten-sión de la plantilla a usar.En este ejemplo usaremos Jinja2, un sis-tema de plantillas muy parecido al empleadopor Django pero más flexible y potente. Pri-mero tenemos que instalar la extensión dePyramid para Jinja2:
$ pp install pyramid_jinja2
Una vez instalada debemos indicar a Pyra-mid que cargue la extensión y con qué fiche-ros queremos que use Jinja2 (en nuestro casolos que acaben en «.html»). Debemos modifi-car el fichero
ejemplo/ejemplo/__init__.py
,que alberga la configuración para nuestroproyecto, y poner dentro de
main
:
config =
Configurator(settings=settings)config.include(‘pyramid_jinja2’)config.add_renderer(‘.html’,
‘pyramid_jinja2.renderer
_factory’)config.add_static_view(‘static’
, ‘ejemplo:static’)config.scan()config.add_route(‘portada’, ‘/’)
La llamada a
add_renderer()
es la que nospermite indicar a Pyramid que las plantillascon extensión
.html
deberán ser renderiza-das empleando
 Jinja2
. Además llamamos a
scan()
, que se encargará de buscar las vis-tas que definamos y nos ahorrará el tenerque añadirlas una a una con
add_view()
,como vimos en el Listado 1. Pero para queesto sea posible nuestra vista debe cambiarla forma de trabajar; debemos poner elsiguiente código en
ejemplo/ejemplo/views.py
:
from pyramid.viewimport
view_config@view_config (route_name =
”portada”, renderer =
’ejemplo:templates/portada.html’)def portada(request):return {‘saludo’:‘Hola mundo!!’}$ paster create -t
pyramid_routesalchemy
ejemplo
Como resultado obtendremos un directoriollamado
ejemplo
que albergará nuestro pro-yecto, y en su interior un módulo Python lla-mado también
ejemplo
. Para poder arrancarel proyecto tenemos que generar primero unfichero de configuración e instalar los paque-tes necesarios mediante el comando:
$ cd ejemplo$ python setup.py develop
Pyramid trae dos configuraciones: «deve-lop» para desarrollo y «production» parael entorno de producción. Cada una apa-recerá como un fichero con extensión
.ini
que nos permitirá configurar el pro-yecto. Mientras que otros frameworks,como Django, prefieren que laconfiguración se haga usando código
01 from paste.httpserver import serve02 from pyramid.configuration import Configurator03 from pyramid.response import Response0405 def hola_mundo(request):06 nombre = request.matchdict.get(‘nombre’, ‘mundo’)07 return Response(‘Hola {0}!’.format(nombre))0809 if __name__ == ‘__main__’:10 config = Configurator()11 config.add_route(‘index’, ‘/’)12 config.add_route(‘hola’, ‘/{nombre}’)13 config.add_view(hola_mundo, route_name=’hola’)14 config.add_view(hola_mundo, route_name=’index’)1516 app = config.make_wsgi_app()17 serve(app, host=’0.0.0.0’)
Listado 1: Ejemplo de Pyramid Básico.
01 from pyramid.view import view_config0203 @view_config(route_name=”portada”,04 renderer=’ejemplo:templates/portada.html’)05 def portada(request):06 saludo = ‘Hola mundo!!’07 if request.POST:08 nombre = request.params. get (‘nombre’, saludo)09 if nombre:10 saludo = “Hola {0}”.format(nombre)1112 return {‘saludo’: saludo}1314 @view_config(route_name=”formulario”,15 renderer=’ejemplo:templates/formulario.html’)16 def formulario(request):17 return {}
Listado 2: Vista que Procesa Parámetros
Figura 1: Página por defecto de Pyramid y debug_toolbar.
 
Para indicar el
route_name
y la plantilla queusaremos en la vista
 portada
usaremos eldecorador
@view_config()
. En él podemosdefinir todos los parámetros que necesitaPyramid para usar la vista. Con el parámetro
renderer 
indicamos que queremos la plantilla
 portada.html
, que debe estar dentro deldirectorio
templates
del módulo
ejemplo
.Cada módulo puede disponer de sus propiasplantillas independientes, lo que aumenta lamodularidad del diseño. Además, como laplantilla acaba en
.html
, Pyramid empleará el
rendererJinja2
.
 Jinja2
permite establecer herencia entreplantillas, por lo que crearemos una plantilla
ejemplo/ejemplo/templates/base.html
:
<html><body><h1>Bienvenido<h1><hr/>{% block contenido %}{% endblock %}</body></html>
Y otra plantilla más llamada
ejemplo/ejem- plo/templates/portada.html
:
{% extends “ejemplo:
templates/ base.html” %}{% block
contenido %}<h2>{{saludo}}
</h2>{% endblock %}
La extensión
 pyra-mid_jinja2
se encargade convertir la ruta
ejemplo:templates /base.html
en unaruta del sistema deficheros que
 Jinja2
pueda utilizar. Vamosa añadir una nueva vista para demostrarcómo funcionan los enlaces y los formu-larios (ver Listado 2, Listado 3 y Listado4).Creamos una nueva vista que apunta-mos a la ruta por defecto de nuestro pro-yecto. De esta forma la página principalmostrará un formulario para que poda-mos pasar un nombre. En el Listado 4podemos ver el código de la plantilla
ejemplo/ejemplo/templates/formulario.ht ml
, donde generamos la url que procesaráel formulario así:
<form action =
”{{request.route_url
(‘portada’)}}”method=”post”>
A
request.route_url()
le pasamos el
route_name
de la vista que queremos queprocese el formulario. De esta forma pode-mos decidir cambiar qué vista lo procesarásiguiendo cualquier criterio que queramos,puesto que la asignación de un
route_name
a una vista puede variar durante la ejecuciónde la llamada (por ejemplo, empleando cri-terios de seguridad, o si el usuario está regis-trado o no).En el Listado 2 podemos observar que eltratamiento de los datos es rudimentario.Pyramid no cuenta con una librería procesa-dor de formularios como Django, sino quedependemos del uso de una librería externa.Existen varias opciones posibles, pero lasmás conocidas son
 FormEncode
y
 FormAl-
Python: Pyramid
DESARROLLO
51
Número 75
WWW.LINUX
-
MAGAZINE.ES
01 config = Configurator(settings=settings)02 config.include(‘pyramid_jinja2’)03 config.add_renderer(‘.html’, ‘pyramid_jinja2.ren-derer_factory’)04 config.add_static_view(‘static’, ‘ejemplo:static’)05 config.scan()06 config.add_route(‘portada’, ‘/hola’)07 config.add_route(‘formulario’, ‘/’)
Listado 3: Configuración Necesaria para el Listado 2
01 {% extends “ejemplo:templates/base.html” %}02 {% block contenido %}03 <form action=”{{request.route_url(‘portada’)}}”method=”post”>04 <p>05 <input type=”text” name=”nombre”/>06 <button type=”submit”>enviar</button>07 </p>08 </form>09 {% endblock %}
Listado 4: Plantilla formulario.html
Figura 2: El comando “top” funcionando en nuestro navegador.
01 {% extends“ejemplo:templates/base.html”%}02 {% block extrahead %}03 <scriptsrc=”http://code.jquery.com/jquery-1.6.2.min.js”></script>04 <scriptsrc=”http://cdn.socket.io/sta-ble/socket.io.js”></script>05 <script>06 var socket = null;07 var txt = null08 $(function() {09 socket = new io.Socket(null,{});10 socket.on(‘connect’, func-tion() {11 socket.send({type: “connect”,userid: 123});12 });13 socket.on(‘message’, func-tion(obj) {14 if (obj.type == “showdata”) {15 console.log(“Message”,JSON.stringify(obj));16 txt = obj.txt;17 $(‘#htop’).html(txt);18 }19 });20 socket.connect();21 });22 </script>23 <style>24 #htop {25 font-family: monospace;26 font-size: 12pt;27 background: black;28 color: green29 }30 </style>31 {% endblock %}32 {% block contenido %}33 <h2>htop</h2>34 <pre id=”htop” ></pre>35 {% endblock %}
Listado 5: Plantilla top.html

Activity (10)

You've already reviewed this. Edit your review.
1 thousand reads
1 hundred reads
Etzra Lopez liked this
Etzra Lopez liked this
Gabo TheKarma liked this
Aprender Libre liked this
Kurgan Gl liked this

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->