Vous êtes sur la page 1sur 50

Boas prticas de Django

Filipe Ximenes

Filipe Ximenes
Fundador da Vinta; Desenvolvedor Web; Apaixonado por aprender; F de comunidades de Sofware Livre; Curioso de empreendedorismo.

Boas prticas
de Django

Boas prticas
Boas prticas de programao so um conjunto de regras informais que a comunidade de desenvolvimento de software tem aprendido ao longo do tempo para melhorar a qualidade das aplicaes e simplificar sua manuteno.

Boas prticas de

Django

Django
Django o framework web para perfeccionistas com prazos.

No mgica; No difcil; No requer mais do que conhecer Django.

Requer vontade; Requer prtica; Os resultados so sensveis.

1. Mantenha seu ambiente de trabalho limpo e isolado de outros projetos

Virtualenv
pip install virtualenv virtualenv .venv source .venv/bin/activate

http://www.virtualenv.org/

Virtualenvwrapper
pip install virtualenvwrapper export WORKON_HOME=~/.virtualenvs mkdir -p $WORKON_HOME echo "source /usr/local/bin/virtualenvwrapper.sh" \ >> ~/.bash_profile mkvirtualenv my_project workon my_project deactivate

http://virtualenvwrapper.readthedocs.org/

2. Deixe claro o que configurao de desenvolvimento e o que configurao de produo

Settings
Como a muitos fazem:
my_project/ setting.py local_settings.py.example

Assim ca mais claro:


my_project/ settings/ base.py local.py production.py

settings/local.py & settings/production.py

from .base import *

Guardar settings em varivel de ambiente?



No deixa explicito as conguraes que esto sendo usadas; S o criador do projeto vai saber configurar os ambientes de desenvolvimento e produo; Novos desenvolvedores devem ser capazes de rodar o projeto pela primeira vez sem dificuldades.

3. Facilite a sua vida e a de quem est iniciando no projeto

manage.py & wsgi.py

os.environ.setdefault( "DJANGO_SETTINGS_MODULE", "my_project.settings.local" )

Em produo

export \ DJANGO_SETTINGS_MODULE= \ my_project.settings.production

Nem sempre tudo pode ficar explicito, pelo menos grite quando houver algo errado settings/production.py
def get_env_variable(var_name): try: return os.environ.get(var_name) except: error_msg = "Defina a varivel de ambiente %s" \ % var_name raise ImproperlyConfigured(error_msg) VARIAVEL = get_env_variable('VARIAVEL')

Makefile
clean: find . -name "*.pyc" -delete deps: pip install -r requirements/local.txt setup: clean deps rm -rf my_db_name.db python manage.py syncdb --noinput python manage.py migrate python manage.py createsuperuser \ --email "test@myproject.com" run: python manage.py runserver

README.md
#Meu Projeto Este um projeto exemplo para falar sobre boas prticas de Django ##Instalao Para rodar o projeto localmente voc precisa apenas executar o comando: ``` make setup ```

4. Sempre que puder, crie novos apps

Apps

No fcil separar de separar depois que esto em produo juntos; Quando grandes so complicados de manter; Tente isolar o mximo possvel, e reduzir dependncias.

Onde colocar cdigo que no pertence a nenhum app especfico?

Crie um app 'core' na sua aplicao para comportar esta situao.

Correto

Errado

5. No ignore o User do Django

User do Django

Facilidade; Compatibilidade:

Com o Django; Com apps de terceiros.

AbstractUser
Adicione novos campos:
https://docs.djangoproject.com/en/dev/topics/auth/customizing/ #extending-django-s-default-user

AbstractBaseUser
Adicione e remova campos:
http://catherinetenajeros.blogspot.com.br/2013/03/django-15subclass-abstractbaseuser.html

6. Use signals [com cautela]

models.py
class MyUser(...): ... from .signals import *

signals.py
from django.db.models.signals import \ pre_save from django.dispatch import receiver from django.core.mail import send_mail from .models import MyUser @receiver(pre_save, sender=MyUser) def send_email(sender, instance, **kwargs): if not instance.pk: send_mail(...)

Todo superuser staff


class MyUser(...): ... is_staff = models.BooleanField() is_supperuser = models.BooleanField() ... def save(self, *args, **kwargs): if self.is_supperuser: self.is_staff = True super(MyUser, self).save(*args,\ **kwargs)

Quando usar?

Enviar email uma ao secundria, no impacta no comportamento do model; Exigir que todo superuser seja staff impacta no comportamento do model.

7. Sobrescreva o ModelManager

onde devem ficar as suas queries


managers.py
from django.db import models class ManagerUtil(models.Manager): def get_or_none(self, **kwargs): try: return self.get(**kwargs) except ObjectDoesNotExist: return None

8. No repita-se (don't repeat yourself)

Templates
home.html
<htlm> <head> <title>Home</title> ... <head> <header> ... </header> <div> ... </div> <footer> ... </footer> </html>

Templates
contato.html
<htlm> <head> <title>Contato</title> ... <head> <header> ... </header> <div> ... </div> <footer> ... </footer> </html>

Templates Blocks
base.html
<htlm> <head> <title> {% block title %}My Project{% endblock %} </title> ... <head> <header> ... </header> <div> {% block content %} {% endblock %} </div> <footer> ... </footer> </html>

Templates Blocks
home.html
{% extends 'base.html' %} {% block title %}Home{% endblock %} {% block content %} ... {% endblock %}

contato.html
{% extends 'base.html' %} {% block title %}Contato{% endblock %} {% block content %} ... {% endblock %}

Mixins
class MeuUser(...): ... is_deleted = models.BooleanField(default=False) ... def delete(self): self.is_deleted = True self.save() class OutroModel(...): ... is_deleted = models.BooleanField(default=False) ... def delete(self): self.is_deleted = True self.save()

Mixins
class SoftDeleteMixin(models.Model): class Meta: abstract = True is_deleted = models.BooleanField( \ default=False) def delete(self): self.is_deleted = True self.save()

Mixins
class MeuUser(SoftDeleteMixin): ... class OutroModel(SoftDeleteMixin): ...

9. Teste TUDO

Um arquivo de teste para cada arquivo do app


app/ tests/ test_models.py test_managers.py test_views.py

https://github.com/jezdez/django-discover-runner

Model Mommy
# para instalar pip install model_mommy # No seu arquivo de testes kid = mommy.make('family.Kid')

https://github.com/vandersonmota/model_mommy

1. Mantenha seu ambiente de trabalho limpo e isolado de outros projetos; 2. Deixe claro o que configurao de desenvolvimento e o que configurao de produo; 3. Facilite a sua vida e a de quem est iniciando no projeto; 4. Sempre que puder, crie novos apps; 5. No ignore o User do Django.

6. Use signals [com cautela]; 7. Sobrescreva o ModelManager; 8. No repita-se (don't repeat yourself); 9. Teste TUDO.

github.com/filipeximenes bitbucket.org/filipeximenes filipeximenes@gmail.com twitter.com/xima

Vous aimerez peut-être aussi