boas práticas de django

50
Filipe Ximenes Boas práticas de Django

Upload: filipe-ximenes

Post on 18-Dec-2014

1.582 views

Category:

Technology


9 download

DESCRIPTION

Desenvolver um projeto não se trata apenas de escrever código funcional. Legibilidade, modularização, acoplamento, portabilidade, complexidade e documentação são todas métricas importantíssimas para se produzir código de qualidade. Respondendo perguntas como: Como organizar os arquivos no projeto? Quais bibliotecas podem ajudar a tormar sua aplicação mais robusta e melhorar seu código? Como organizar seu ambiente de desenvolvimento, staging e produção? O que são boas e más práticas de desenvolvimento? vamos debater como e quais ferramentas e padrões podem nos ajudar a desenvolver código de qualidade, sem que seja preciso muito esforço.

TRANSCRIPT

Page 1: Boas práticas de django

Filipe Ximenes

Boas práticas de Django

Page 2: Boas práticas de django

Filipe Ximenes

•Fundador da Vinta;

•Desenvolvedor Web;

•Apaixonado por aprender;

•Fã de comunidades de Sofware Livre;

•Curioso de empreendedorismo.

Page 3: Boas práticas de django

Boas práticasde Django

Page 4: Boas práticas de django

Boas práticasBoas práticas de programação são um

conjunto de regras informais que a comunidade de desenvolvimento de

software tem aprendido ao longo do tempo para melhorar a qualidade das aplicações e

simplificar sua manutenção.

Page 5: Boas práticas de django

Boas práticas

deDjango

Page 6: Boas práticas de django

Django

Django é o framework web para perfeccionistas com prazos.

Page 7: Boas práticas de django

• Não é mágica;

• Não é difícil;

• Não requer mais do que conhecer Django.

Page 8: Boas práticas de django

• Requer vontade;

• Requer prática;

• Os resultados são sensíveis.

Page 9: Boas práticas de django

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

Page 10: Boas práticas de django

Virtualenv

pip install virtualenvvirtualenv .venvsource .venv/bin/activate

http://www.virtualenv.org/

Page 11: Boas práticas de django

Virtualenvwrapperpip install virtualenvwrapperexport WORKON_HOME=~/.virtualenvsmkdir -p $WORKON_HOMEecho "source /usr/local/bin/virtualenvwrapper.sh" \ >> ~/.bash_profilemkvirtualenv my_project

workon my_project deactivate

http://virtualenvwrapper.readthedocs.org/

Page 12: Boas práticas de django

2. Deixe claro o que é configuração de desenvolvimento e o que é configuração de produção

Page 13: Boas práticas de django

Settings

my_project/ setting.py local_settings.py.example

Como a muitos fazem:

Assim fica mais claro:

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

Page 14: Boas práticas de django

settings/local.py & settings/production.py

from .base import *

Page 15: Boas práticas de django

Guardar settings em variável de ambiente?

• Não deixa explicito as configurações que estão sendo usadas;

• Só o criador do projeto vai saber configurar os ambientes de desenvolvimento e produção;

• Novos desenvolvedores devem ser capazes de rodar o projeto pela primeira vez sem dificuldades.

Page 16: Boas práticas de django

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

Page 17: Boas práticas de django

manage.py & wsgi.py

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

Page 18: Boas práticas de django

Em produção

export \ DJANGO_SETTINGS_MODULE= \ “my_project.settings.production”

Page 19: Boas práticas de django

Nem sempre tudo pode ficar explicito, pelo menos grite quando houver algo

errado

def get_env_variable(var_name): try: return os.environ.get(var_name) except: error_msg = "Defina a variável de ambiente %s" \ % var_name raise ImproperlyConfigured(error_msg)

VARIAVEL = get_env_variable('VARIAVEL')

settings/production.py

Page 20: Boas práticas de django

Makefileclean: 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 "[email protected]"

run: python manage.py runserver

Page 21: Boas práticas de django

README.md

#Meu ProjetoEste é um projeto exemplo para falar sobreboas práticas de Django

##InstalaçãoPara rodar o projeto localmente vocêprecisa apenas executar o comando:```make setup```

Page 22: Boas práticas de django

4. Sempre que puder, crie novos apps

Page 23: Boas práticas de django

Apps

• Não é fácil separar de separar depois que estão em produção juntos;

• Quando grandes são complicados de manter;

• Tente isolar o máximo possível, e reduzir dependências.

Page 24: Boas práticas de django

Onde colocar código que não pertence a nenhum app

específico?

• Crie um app 'core' na sua aplicação para comportar esta situação.

Page 25: Boas práticas de django

Correto

Page 26: Boas práticas de django

Errado

Page 27: Boas práticas de django

5. Não ignore o User do Django

Page 28: Boas práticas de django

User do Django

• Facilidade;

• Compatibilidade:

• Com o Django;

• Com apps de terceiros.

Page 30: Boas práticas de django

6. Use signals [com cautela]

Page 31: Boas práticas de django

models.py

class MyUser(...): ...

from .signals import *

Page 32: Boas práticas de django

signals.pyfrom django.db.models.signals import \pre_savefrom django.dispatch import receiverfrom 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(...)

Page 33: Boas práticas de django

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)

Page 34: Boas práticas de django

Quando usar?

• Enviar email é uma ação secundária, não impacta no comportamento do model;

• Exigir que todo superuser seja staff impacta no comportamento do model.

Page 35: Boas práticas de django

7. Sobrescreva o ModelManager

Page 36: Boas práticas de django

É onde devem ficar as suas queries

from django.db import models

class ManagerUtil(models.Manager):

def get_or_none(self, **kwargs): try: return self.get(**kwargs) except ObjectDoesNotExist: return None

managers.py

Page 37: Boas práticas de django

8. Não repita-se (don't repeat yourself)

Page 38: Boas práticas de django

Templates

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

home.html

Page 39: Boas práticas de django

Templates

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

contato.html

Page 40: Boas práticas de django

Templates Blocks

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

base.html

Page 41: Boas práticas de django

Templates Blocks

{% extends 'base.html' %}

{% block title %}Home{% endblock %}

{% block content %} ...{% endblock %}

home.html

{% extends 'base.html' %}

{% block title %}Contato{% endblock %}

{% block content %} ...{% endblock %}

contato.html

Page 42: Boas práticas de django

Mixinsclass 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()

Page 43: Boas práticas de django

Mixins

class SoftDeleteMixin(models.Model): class Meta: abstract = True

is_deleted = models.BooleanField( \ default=False)

def delete(self): self.is_deleted = True self.save()

Page 44: Boas práticas de django

Mixins

class MeuUser(SoftDeleteMixin): ...

class OutroModel(SoftDeleteMixin): ...

Page 45: Boas práticas de django

9. Teste TUDO

Page 46: Boas práticas de django

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

Page 47: Boas práticas de django

Model Mommy

# para instalarpip install model_mommy

# No seu arquivo de testeskid = mommy.make('family.Kid')

https://github.com/vandersonmota/model_mommy

Page 48: Boas práticas de django

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

2. Deixe claro o que é configuração de desenvolvimento e o que é configuração de produção;

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

4. Sempre que puder, crie novos apps;

5. Não ignore o User do Django.

Page 49: Boas práticas de django

6. Use signals [com cautela];

7. Sobrescreva o ModelManager;

8. Não repita-se (don't repeat yourself);

9. Teste TUDO.

Page 50: Boas práticas de django

?github.com/filipeximenes

bitbucket.org/[email protected]

twitter.com/xima