TopoRojo

Un pouco de todo e moito de nada

TopoRojo - Un pouco de todo e moito de nada

Desarrollo web con Python: Pylons

Empezando por el principio, ¿por que desarrollar webs en Python? Pues copiando lo que leí en xergio.net (muy recomendable) por su relación calidad/sencillez/comunidad.

¿Qué es Pylons?

Pylons es un framework de aplicaciones web open source que implementa el patrón modelo-vista-controlador. Pylons usa intensivamente el estandard Web Server Gateway Interface (WSGI).Pylons posee una fuerte influencia de Ruby on Rails. Dos de sus principales componentes Routes and WebHelpers son reimplementaciones de Rails en Python.

Crear un blog sencillo desde cero en Pylons

1. Instalación, configuración y modelo.

Lo primero que necesitamos, es instalar Pylons

easy_install Pylons
easy_install SQLAlchemy #ORM

En este caso vamos usar como base de datos PostgreSQL 9,1 por lo que necesitamos psycopg2

# En nuestra carpeta de usuario ( o donde queramos )
paster create -t pylons MyBlog    # Cuando nos pregunte por el tipo de
# plantillas seleccionaremos mako.
# Cuando pregunte por incluir SQLAlchemy, marcaremos True.
cd MyBlog

Editamos el fichero development.ini y en la sección [app:main], indicamos la configuración de la base de datos.

sqlalchemy.url = postgres://username:password@host:port/database

Luego con ayuda de sqlalchemy, creamos el modelo en ~/MyBlog/myblog/model/__ init __.py

Dejándolo de la siguiente manera:

import sqlalchemy as sa
from sqlalchemy import types

from myblog.model.meta import Session, Base

def init_model(engine):
    """Llamado antes de usar cualquiera de las tablas o clases en el modelo"""
    Session.configure(bind=engine)

class Blog(Base):
    __tablename__ = "Blog"
    __mapper_args__ = dict(order_by="date desc")

    id = sa.Column(types.Integer, primary_key=True)
    subject = sa.Column(types.Unicode(255))
    author = sa.Column(types.Unicode(255))
    date = sa.Column(types.DateTime())
    content = sa.Column(types.Text())

Ahora es necesario editar ~/MyBlog/myblog/websetup.py :

"""Setup the MyBlog application"""
import logging

import pylons.test

from myblog.config.environment import load_environment
from myblog.model.meta import Session, Base

log = logging.getLogger(__name__)

def setup_app(command, conf, vars):
    """Place any commands to setup myblog here"""
    # Don't reload the app if it was loaded under the testing environment
    if not pylons.test.pylonsapp:
        load_environment(conf.global_conf, conf.local_conf)

    # Create the tables if they don't already exist
    log.info("Creating database tables")
    Base.metadata.create_all(bind=Session.bind)
    log.info("Finished setting up")

Por último, en este primer paso, dentro de la carpeta general del proyecto, en este caso MyBlog, ejecutaremos:

paster setup-app development.ini

que se ocupará de crear nuestra base de datos.

2. Controladores

Pylons basa sus aplicaciones en una serie de controladores, así que vamos a crear el controlador del blog.

De nuevo en la carpeta raíz del proyecto, ejecutaremos:

paster controller blog

Modificamos el controlador del blog, en ~/MyBlog/myblog/controllers/blog.py dejándolo de esta manera:

import logging

from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from myblog.lib.base import BaseController, render
from myblog import model

log = logging.getLogger(__name__)

class BlogController(BaseController):
    # Recuperamos los 5 últimos post y los enviamos a la plantilla.
    def index(self):
        q = model.Session.query(model.Blog)
        c.posts = q.limit(5)
        return render("/blog/index.mako")

Crearemos la plantilla en la ruta ~/MyBlog/myblog/templates/blog/index.mako

<%inherit file="site.mako" />
<%def name="title()">MyBlog Home</%def>

<p>${c.posts.count()} new blog posts!</p>

% for post in c.posts:
<p class="content" style="border-style:solid; border-width:1px">
        <span class="h3"> ${post.subject} </span>
        <span class="h4">Posted on: ${post.date} by ${post.author}</span>
        <br>
          ${post.content}
</p>
% endfor

Por último en este paso, necesitamos crear el HTML base del sitio, lo crearemos en la siguiente ruta ~/MyBlog/myblog/templates/blog/site.mako dejándolo, por ejemplo,  de la siguiente manera:

<%def name="title()"></%def>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>MyBlog: ${self.title()}</title>
    </head>
    <body>
        <h1>${self.title()}</h1>

<!-- *** BEGIN page content *** -->
${self.body()}
<!-- *** END page content *** -->

    </body>
</html>

3. Prueba de la aplicación

Para ejecutar la aplicación, ejecutaremos en el directorio raíz de la aplicación:

 paster serve --reload development.ini

Ahora podremos ver nuestro blog en http://localhost:5000/blog

Si nos movemos a http://localhost:5000/ veremos la página por defecto de Pylons, podemos situar nuestro blog en la raíz, con dos sencillos pasos:

  1. Borrar o renombrar el fichero ~/MyBlog/myblog/public/index.html
  2. Añadiendo una nueva regla de enrutamiento en el fichero ~/MyBlog/myblog/config/routing.py de la siguiente manera:

Debajo del comentario “# CUSTOM ROUTES HERE”, añadiremos esta línea:

map.connect('/', controller='blog', action='index')

4. Añadir una interfaz de administrador

Creamos el controlador con el nombre seleccionado, en este caso “toolkit” lanzando el siguiente comando en desde el directorio raíz.

paster controller toolkit

Crearemos las plantillas del “administrador”, una para el inicio y otra con el formulario para incluir nuevos posts.

mkdir ~/MyBlog/myblog/templates/toolkit

~/MyBlog/myblog/templates/toolkit/index.mako

<%inherit file="/blog/site.mako" />
<%def name="title()">Admin Control Panel</%def>

This is home of the toolkit. <br>
For now you can only
<a href="${url(controller="toolkit", action="blog_add")}">add</a>
blog posts.
<p>
Later on you'll be able to delete and edit also.

~/MyBlog/myblog/templates/toolkit/add.mako

<%inherit file="/blog/site.mako" />
<%def name="title()">Add Blog Post</%def>

<span class="h3"> Post a Comment </span>
${h.form(url(controller='toolkit', action='blog_add_process'))}
<label>Subject: ${h.text('subject')}</label><br>
<label>Author: ${h.text('author')}</label><br>
<label>Post Content: ${h.textarea('content')}</label><br>
${h.submit('post', 'Post New Page')}
${h.end_form()}

Añadimos:

~/MyBlog/myblog/lib/helpers.py

from webhelpers.html.tags import form, text, textarea, submit, end_form

Y creamos el controlador.

~/MyBlog/myblog/controllers/toolkit.py

import datetime
import logging

from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from myblog.lib.base import BaseController, render
from myblog import model

log = logging.getLogger(__name__)

class ToolkitController(BaseController):

    def index(self):
        return render('/toolkit/index.mako')

    def blog_add(self):
        return render('/toolkit/add.mako')

    def blog_add_process(self):
        # Create a new Blog object and populate it.
        newpost = model.Blog()
        newpost.date = datetime.datetime.now()
        newpost.content = request.params['content']
        newpost.author = request.params['author']
        newpost.subject = request.params['subject']
        # I didn't set ID because it will get a value automatically.

        # Attach the object to the session.
        model.Session.add(newpost)

        # Commit the transaction.
        model.Session.commit()

        # Redirect to the blog home page.
        redirect(url(controller="blog", action="index"))

Una vez creado, podremos añadir nuevos posts a nuestro blog en la siguiente URL

http://localhost:5000/toolkit/index

O entrar directamente al formulario.

http://localhost:5000/toolkit/blog_add

Saludos.

Fuente: wiki.pylonshq.com

Categoría: Pylons
  • Isra comentó:

    Python es un magnífico lenguaje de programación, buen artículo, me servirá mucho para un proyecto que tengo en mente, un saludo!!

  • sara comentó:

    Gran tutorial. Soy totalmente novata en aplicaciones web y quiero probar a hacer algo con python, ya que es un lenguaje sencillo que suelo utilizar.

    He ido paso a paso y en el punto 3 me da un “Server Error 404″. ¿Alguna idea de qué puedo haber hecho mal?

    Gracias y un saludo!

Tu dirección de correo no será publicada. Los campos obligatorios están marcados con *

*