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:
- Borrar o renombrar el fichero ~/MyBlog/myblog/public/index.html
- 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
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!!
chucu comentó:
Gracias, suerte con el proyecto
Israel | Hedoné Online comentó:
Proyecto en marcha…
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!