Introduction to django-ssiexport (protoype)

Thu 21 August 2014
By paulo

O que é django-ssiexport ?

É um app que irá ajudar a exportar seu projeto de editoração de conteúdo (portals) como html estático para resolver todos os problemas de performance e muito acesso.

Procurando pela internet o único que achei e pretende fazer as mesmas coisas é django-medusa. Porém ele apenas exporta as urls declaradas ou por queryset (usando a url retornada pelo get_absolute_url).

Para situações simples ele realmente funciona bem, porém como sabemos uma página de conteúdo em um portal é montada não apenas com um conteúdo, algumas vezes itens relacionados (que aparecem em todo o site) fazem parte (99% das vezes) da página.

Começando pela idéia do django-medusa o objetivo é chegar uma boa lógica de geração de conteúdo estático a ponto de que ao alterar o título de um conteúdo apenas onde ele aparece que iremos reescrever o conteúdo estático.

Ao alcançar este objetivo iremos para o próximo passo que será conseguir gerar de forma granular o conteúdo estático. Exemplo, se uma template é chamada como include em vários locais teriamos ela armazenada em disco apenas uma vez.

A cereja do bolo será quando conseguirmos usar todo o sistema de geração de conteúdo estático sem precisar mudar a forma em que programamos ou seja sem usar a todos momento as templatetags necessárias para declarar os conteúdos usados no arquivo de conteúdo estático.

Primeira release (v0.1)

Na primeira versão melhoraremos a lógica do django-medusa armazenando as templates usadas para gerar o conteúdo estático e os models relacionados aquele conteúdo.

O setup para usar o aplicativo seria algo assim, criar um arquivo export.py na pasta do app. O conteúdo dele seria algo parecido com:

from myapp.models import Post

class PostExport(object):
    def get_urls(self):
        return [i.get_aboslute_url() for i in Post.objects.published()]


exporters = (PostExport, )

Imagine que no models.py existe um model chamado Image:

from django.db import models

class Post(models.Model):
    pass

class Image(object):
    post = models.ForeignKey("Post")

Para declarar que as instâncias de Image estão relacionadas ao Post na template post_detail.html podemos declarar de duas formas.

Usando queryset:

{% load ssiexport_tags %}

{% watch post.image_set.all %}

{% for image in object.image_set.all %}
    <img src="{{ image.file.url }}" />
{% endfor %}

Ou pela instância do Model:

{% load ssiexport_tags %}

{% for image in object.image_set.all %}
    {% watch image %}
    <img src="{{ image.file.url }}" />
{% endfor %}

A templatetag watch irá cuidar de declarar que aquele o conteúdo daquele model interfere no conteúdo renderizado (estático) para aquela URL.

A declaração de templates usadas é feita de forma automática da mesma forma que os tests do django fazem.

Bem, esta á a idéia de primeira release, como ela irá funcionar. Criarei mais posts sobre como iremos trabalhar o restante das idéias.