Openboe en Flask

Este puente además de aprovechar para descansar, he estado aprovechando para avanzar algo más en Sabrosous, comenzando a probar algunas de las funcionalidades, aunque aún están algo lejos de ser 100% usables sus características básicas.

Tenía ganas desde hace tiempo de probar Flask, el microframework de Python, que me resultaba tan parecido a DENIED, aunque siendo el primero Software Libre, del segundo no he encontrado el código en ninguna parte. Una noche comencé a jugar con Flask y reescribí lo poco que tenía de mi proyecto openboe, una aplicación que de forma amigable quiere interactuar con la información que el Boletín Oficial del Estado muestra en RSS.

La aplicación principal de openboe sería la siguiente:


# -*- coding: utf-8 -*-
from flask import Flask, render_template, request, abort, redirect, url_for
from app_modules.feed import parse
app = Flask(__name__)

@app.route("/")
def index():
    return "Hello World!"

@app.route("/feed/", methods=['GET', 'POST'])
def feed(name):
    feeds = ["seccionI", "seccionII", "seccionIII", "seccionIV"]
    topics = {
              "becas": "http://www.boe.es/rss/canal.php?c=becas",
              "ayudas": "http://www.boe.es/rss/canal.php?c=ayudas",
              "estudio": "http://www.boe.es/rss/canal.php?c=planes",
              "convenios": "http://www.boe.es/rss/canal.php?c=ccolectivos",
              "divisas": "http://www.boe.es/rss/canal.php?c=cambios",
              "prestamos": "http://www.boe.es/rss/canal.php?c=prestamos",
              "servicios": "http://www.boe.es/rss/canal.php?c=cartas", 
              "colaboracion": "http://www.boe.es/rss/canal.php?c=ccolaboracion",
              "premios": "http://www.boe.es/rss/canal.php?c=premios"
              }
    filter_by = ""

    if request.method == 'POST':
        #TODO check POST['q']
        filter_by = request.form['q']

    if topics.has_key(name):
        links = parse(topics[name], filter_by)
    else:
        abort(404)

    return render_template("feeds.html", links=links, query=filter_by)

if __name__ == "__main__":
    app.debug = True
    app.run()

La aplicación es bastante sencilla. Creamos un objeto app único para toda la aplicación y que se encargará de "hablar" con mod_wsgi.

Mediante @app.route definimos la ruta de una vista, definida por la función siguiente a este decorador. En ésta podemos recoger los parámetros que tomamos de la url en app.route.

En este ejemplo en función del name pasado por url, miramos en un diccionario que tiene los rss a los distintos contenidos del BOE, si existe el name en el diccionario, parseamos el RSS, si no existe, devolvemos 404 con la función abort de Flask.

Finalmente usamos render_template para elegir la plantilla que vamos a utilizar, usando el motor Jinja2 para éstas, y tras ello le pasamos todos los parámetros que necesitamos para el template.

Podéis ver el ejemplo completo en mi github. Para ejecutar basta lanzar python application.py

Javier Aguirre

Read more posts by this author.

comments powered by Disqus