Você está na página 1de 18

Criando aplicações plugáveis

Marinho Brandão - PyCon Brasil 2008, Rio de Janeiro


O que são aplicações plugáveis?
Exemplos de aplicações
• djapian
 
• django-diario
 
• django-tagging
 
• django-command-extensions
 
• django-antivirus
 
• django-registration
Funcionalidades extensíveis
• Settings da aplicação
minha_app/app_settings.py
APP_SETTING = getattr(settings, 'APP_SETTING', None)
 
• Signals da aplicação
minha_app/app_signals.py
meu_signal = django.dispatch.Signal()
 
• Views extensíveis
Exemplo de view extensível
class FormCidade(forms.ModelForm):
class Meta:
model = Cidade

def index(request, template_path='aplicacao/index.html',


form_class=FormCidade):
form = form_class(request.GET)

return render_to_response(template_path, locals())

url(
r'^$',
'aplicacao.views.index',
{'template_path': 'outro_index.html'},
'ap_index',
)
Templates da aplicação
• É uma boa idéia ter templates da aplicação?
 
• settings.py: TEMPLATE_LOADERS
o django.template.loaders.app_directories.load_template_source
 
• minha_app/templates/admin/minha_app
 
• minha_app/templates/minha_app
Classes de modelo
• Contrib "contenttypes"
o ContentType.objects.get_for_model
 
• Generic Relations
 
• GenericInlineModelAdmin/ GenericInlineFormSet
Exemplo de generic foreign key
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class ForumThread(models.Model):
title = models.CharField(max_length=50)
parent_ct = models.ForeignKey(ContentType)
parent_id = models.PositiveIntegerField()
parent = generic.GenericForeignKey('parent_ct', 'parent_id')

def exemplo(request):
produto = Produto.objects.get(id=1)
nova_thread = ForumThread.objects.create(
title='Thread sobre um produto',
parent_ct=ContentType.objects.get_for_model(Produto),
parent_id=produto.id
)
Boas práticas
• Nomenclatura: inglês para distribuir, português para
realidade nacional
 
• import models / from minha_app import ...
 
• Pacote "apps" é um erro
 
• Usar url() e reverse()

• Versões do Python e Django / GAE


Boas práticas
• doc strings

• Usar aplicação “sites”

• Internacionalização

• Testes

• Todas as combinações possíveis


Distribuindo aplicações
• Repositório (Subversion, Git, Bazaar, Mercurial, etc)

• distutils

• PythonEggs

• Licença (GPL, LGPL, BSD ou WTFPL?)


Manter em mente ao criar aplicação
• Fazer uma coisa e fazer bem
 
• Não ter medo de múltiplas aplicações
 
• Escrever flexível
 
• Construir para distribuir
 
James Bennett, DjangoCon 2008

•Bom senso em tudo


– Django ainda é um framework para pragmáticos
Referências
• Django - Writing Reusable Applications (James Bennet)
o http://media.b-list.org/presentations/2008/djangocon/reusable_apps.pdf 
o http://vivixvideo.com/videos/djangocon-2008-reusable-apps/ 
 
• Reusable Django apps
o http://www.b-list.org/weblog/2007/mar/27/reusable-django-apps/
 
• Tutorial 1 - Phylosophy
o http://docs.djangoproject.com/en/dev/intro/tutorial01/#activating-models 
 
• DjangoPlugables.com
o http://djangoplugables.com/
Conclusão

Vamos embora?
 
marinho@gmail.com
http://marinhobrandao.com

Você também pode gostar