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.