Django - Criando Aplicacoes Plugaveis

Embed Size (px)

Citation preview

Django: criando aplicaes plugveis

Marinho Brando - PyCon Brasil 2008, Rio de Janeiro

Criando aplicaes plugveis

Primeira vez numa PyCon

Sem hbito de falar em pblico

No fcil falar para uma platia dessa

Todo mundo cansado

No aguento mais dormir no colchonete ( isso ou dormir na cama de casal com o Semente)

Andrews Medina sabe divertir a galera

Andrews sabe danar e cantar, eu no

O que so aplicaes plugveis?

Cada formiguinha com sua tarefa

Jos Mrio, mas sou Marinho

2+ anos com Django

O Django motiva a criao de aplicaes plugveis

Componentizao

Exemplos de aplicaes

djapian

django-diario

django-tagging

django-command-extensions

django-antivirus

django-registration

Djapian Rafael

Django-diario Semente

Cometi erros que no quero cometer mais

Existem centenas no Google Code e DjangoPlugables

Aplicao plugvel possui caractersticas que permitem que ela seja facilmente conectada a outras

Componentizao levada ao extremo

Funcionalidades extensveis

Settings da aplicao

minha_app/app_settings.py

APP_SETTING = getattr(settings, 'APP_SETTING', None)

Signals da aplicao

minha_app/app_signals.py

meu_signal = django.dispatch.Signal()

Views extensveis

app_settings.py

app_signals.py

Views extensveis podem receber um parmetro com valor default para definir uma classe de form, caminho de template ou coisas assim

Exemplo de view extensvel

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',

)

app_settings.py

app_signals.py

Views extensveis podem receber um parmetro com valor default para definir uma classe de form, caminho de template ou coisas assim

Aplicao plugvel no adapter

Aplicao plugvel no adapter (dois trambolhos conectados atravs de um adaptador)

Evitar esse tipo de situao

A aplicao possui em sua pasta tudo que a pertence (commands, templates, templatetags, etc)

Templates da aplicao

uma boa idia ter templates da aplicao?

settings.py: TEMPLATE_LOADERS

django.template.loaders.app_directories.load_template_source

minha_app/templates/admin/minha_app

minha_app/templates/minha_app

Templates default podem gerar problemas com a estruturao de blocks e cache. Melhor ter os templates default mas permitir que o template seja informado como parmetro da view

Este template loader facilitou de vez a adoo da idia de que cada aplicao possui dentro de sua prpria pasta, tudo que lhe pertece

Index do admin ainda no extensvel

Classes de modelo

Contrib "contenttypes"

ContentType.objects.get_for_model

Generic Relations

GenericInlineModelAdmin/ GenericInlineFormSet

Evitar a definio de classe de modelo "na unha", melhor informar o caminho e carregar com get_model

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

)

app_settings.py

app_signals.py

Views extensveis podem receber um parmetro com valor default para definir uma classe de form, caminho de template ou coisas assim

Generic Relations...

app_settings.py

app_signals.py

Views extensveis podem receber um parmetro com valor default para definir uma classe de form, caminho de template ou coisas assim

Boas prticas

Nomenclatura: ingls para distribuir, portugus para realidade nacional

import models / from minha_app import ...

Pacote "apps" um erro

Usar url() e reverse()

Verses do Python e Django / GAE

Nomenclatura

Evitar nomes que venham a conflitar com outras bibliotecas de Python

Adotar ingls sempre que possvel

Nome de modulo com template tags no deve ser o mesmoda aplicao

Pasta "apps" deve ser adotada somente para guardar as aplicaes, mas no para import-las, ela deve estar na PYTHONPATH

Boas prticas

doc strings

Usar aplicao sites

Internacionalizao

Testes

Todas as combinaes possveis

Nomenclatura

Evitar nomes que venham a conflitar com outras bibliotecas de Python

Adotar ingls sempre que possvel

Nome de modulo com template tags no deve ser o mesmoda aplicao

Pasta "apps" deve ser adotada somente para guardar as aplicaes, mas no para import-las, ela deve estar na PYTHONPATH

Coca-cola combina com tudo, e um sucesso!

Campanha publicitria da Coca-Cola sobre ela acompanhar sanduche, pizza, qualquer refeio, ao redor do mundo, etc

Moa bebendo coca-cola 2 hrs da manh, 16 graus (e me emprestou a blusa de frio)

Distribuindo aplicaes

Repositrio (Subversion, Git, Bazaar, Mercurial, etc)

distutils

PythonEggs

Licena (GPL, LGPL, BSD ou WTFPL?)

No demonstrar. No tenho experincia com formas de distribuio diferentes de repositrio

GPL mais amarrada, WTFPL totalmente liberada, LGPL e BSD so meio-termo

http://sam.zoy.org/wtfpl/

Manter em mente ao criar aplicao

Fazer uma coisa e fazer bem

No ter medo de mltiplas aplicaes

Escrever flexvel

Construir para distribuir

James Bennett, DjangoCon 2008

Bom senso em tudo

Django ainda um framework para pragmticos

No demonstrar. No tenho experincia com formas de distribuio diferentes de repositrio

GPL mais amarrada, WTFPL totalmente liberada, LGPL e BSD so meio-termo

http://sam.zoy.org/wtfpl/

Referncias

Django - Writing Reusable Applications (James Bennet)

http://media.b-list.org/presentations/2008/djangocon/reusable_apps.pdf

http://vivixvideo.com/videos/djangocon-2008-reusable-apps/

Reusable Django apps

http://www.b-list.org/weblog/2007/mar/27/reusable-django-apps/

Tutorial 1 - Phylosophy

http://docs.djangoproject.com/en/dev/intro/tutorial01/#activating-models

DjangoPlugables.com

http://djangoplugables.com/

James Bennet o cara, mas tambm no perfeito

Idias do "I want a pony"

Concluso

Vamos embora?

[email protected]

http://marinhobrandao.com