Programar RSS complejos para Django

Ya os enseñé cómo programar un RSS en Django. Ahora vamos a hacerlo de forma un poco más compleja, pudiendo incluir parámetros en la URL para que las publicaciones en el feed cambien dependiendo de ellos.

####Paso 1: Importamos las clases necesarias

Son las mismas que el tutorial anterior. Se tratan de Feed de Django, del que heredará nuestra clase; Post que es el modelo de nuestras entradas en el blog; Category, que es el parámetro por el que filtraré los Posts y reverse, que no es necesario pero a mí me gusta usarlo.

from django.contrib.syndication.views import Feed
from poster.models import Post
from poster.models import Category
from django.core.urlresolvers import reverse

####Paso 2: Creamos nuestra clase

Creamos una clase que herede de la clase Feed. Sobreescribiremos algunos métodos necesarios para hacer uso de feeds complejos. Os pego el código y luego lo explico:

class PostByCategory(Feed):
    def get_object(self, request, category_slug):
        return Category.objects.get(slug=category_slug)

    def title(self, obj):
        return u"AlvaroHurtado.es: Categoría %s" % obj.name

    def link(self, obj):
        return reverse("one_category", args=[obj.slug])

    def description(self, obj):
        return obj.meta_description

    def items(self, obj):
        return obj.post_set.order_by("-publication_date")
       
    def item_link(self, item):
        return reverse("one_post", args=[item.slug])
    
    def item_title(self, item):
        return item.title
        
    def item_description(self, item):
        return item.content
        
    def item_pubdate(self, item):
        return item.publication_date

Los métodos title, link y description corresponden con el título, enlace y descripción de cada instancia del feed. Es decir, para cada variación del feed dependiendo de el parámetro establecido. Para generar esos atributos se hace uso del obj que se ha generado con el método get_object que explicaré luego.

Los métodos item_title, item_link, item_description y item_pubdate correspondeon con el título, enlace, descripción y fecha de publicación de cada Post que pasará por el feed.

Ahora los 2 métodos más difíciles:

get_object con los parámetros self, request y category_slug. Este método funciona de forma muy similar a una vista. El parámetro request contiene toda la información de la petición web. El parámetro category_slug es un parámetro definido en la URL del feed. La respuesta del método get_object debe ser un objeto que nos permita generar los elementos vinculados a este feed. En este caso, que vamos a hacer feeds por categoría, utilizo el parámetro category_slug para recuperar de la base de datos la Category correspondiente. El objeto que devolvamos es el que estará disponible en el resto de métodos como obj.

items con los parámetros self y obj. Este método generará el listado de items que estarán disponibles en otros métodos como item. Lo único que hago es recuperar todos los Posts ordenados por fecha de publicación.

####Paso 3: Le asignamos una URL

Es el momento de asignar una URL a nuestro feed.Para ello, importamos la clase que hemos creado anteriormente:

from utility.feeds import PostByCategory

Y asignamos la url que queramos, teniendo en cuenta que tenemos que incluir el parámetro category_slug que indicamos en el método get_object:

    url(r'^rss/(?P[a-zA-Z0-9-_]+)/$', PostByCategory(), name="rss_by_category"),

Para comprobar que funciona, aquí os dejo un par de ejemplos que están funcionando en este blog:

http://www.alvarohurtado.es/rss/programacion/.

http://www.alvarohurtado.es/rss/libros/.

… y ya está. Espero que os haya gustado este tutorial.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

A %d blogueros les gusta esto: