Filipe Ximenes
Boas práticas de
Django
Filipe Ximenes
•Fundador da Vinta;
•Desenvolvedor Web;
•Apaixonado por aprender;
•Fã de comunidades de Sofware Livre;
•Cur...
Boas práticas
de Django
Boas práticas
Boas práticas de programação são um
conjunto de regras informais que a
comunidade de desenvolvimento de
soft...
Boas práticas
deDjango
Django
Django é o framework web para
perfeccionistas com prazos.
• Não é mágica;
• Não é difícil;
• Não requer mais do que conhecer
Django.
• Requer vontade;
• Requer prática;
• Os resultados são sensíveis.
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/...
2. Deixe claro o que é configuração de
desenvolvimento e o que é
configuração de produção
Settings
my_project/
setting.py
local_settings.py.example
Como a muitos fazem:
Assim fica mais claro:
my_project/
settings/...
settings/local.py & settings/production.py
from .base import *
Guardar settings em variável
de ambiente?
• Não deixa explicito as configurações que
estão sendo usadas;
• Só o criador do ...
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 produção
export 
DJANGO_SETTINGS_MODULE= 
“my_project.settings.production”
Nem sempre tudo pode ficar explicito,
pelo menos grite quando houver algo
errado
def get_env_variable(var_name):
try:
retu...
Makefile
clean:
find . -name "*.pyc" -delete
deps:
pip install -r requirements/local.txt
setup: clean deps
rm -rf my_db_na...
README.md
#Meu Projeto
Este é um projeto exemplo para falar sobre
boas práticas de Django
##Instalação
Para rodar o projet...
4. Sempre que puder, crie novos apps
Apps
• Não é fácil separar de separar depois
que estão em produção juntos;
• Quando grandes são complicados de
manter;
• T...
Onde colocar código que não
pertence a nenhum app
específico?
• Crie um app 'core' na sua aplicação para
comportar esta si...
Correto
Errado
5. Não ignore o User do Django
User do Django
• Facilidade;
• Compatibilidade:
• Com o Django;
• Com apps de terceiros.
AbstractUser
AbstractBaseUser
•Adicione novos campos:
•Adicione e remova campos:
https://docs.djangoproject.com/en/dev/top...
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 impor...
Todo superuser é staff
class MyUser(...):
...
is_staff = models.BooleanField(…)
is_supperuser = models.BooleanField(…)
......
Quando usar?
• Enviar email é uma ação secundária,
não impacta no comportamento do
model;
• Exigir que todo superuser seja...
7. Sobrescreva o ModelManager
É onde devem ficar as suas
queries
from django.db import models
class ManagerUtil(models.Manager):
def get_or_none(self, *...
8. Não repita-se (don't repeat yourself)
Templates
<htlm>
<head>
<title>Home</title>
...
<head>
<header>
...
</header>
<div>
...
</div>
<footer>
...
</footer>
</ht...
Templates
<htlm>
<head>
<title>Contato</title>
...
<head>
<header>
...
</header>
<div>
...
</div>
<footer>
...
</footer>
<...
Templates Blocks
<htlm>
<head>
<title>
{% block title %}My Project{% endblock %}
</title>
...
<head>
<header>
...
</header...
Templates Blocks
{% extends 'base.html' %}
{% block title %}Home{% endblock %}
{% block content %}
...
{% endblock %}
home...
Mixins
class MeuUser(...):
...
is_deleted = models.BooleanField(default=False)
...
def delete(self):
self.is_deleted = Tru...
Mixins
class SoftDeleteMixin(models.Model):
class Meta:
abstract = True
is_deleted = models.BooleanField( 
default=False)
...
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/...
Model Mommy
# para instalar
pip install model_mommy
# No seu arquivo de testes
kid = mommy.make('family.Kid')
https://gith...
1. Mantenha seu ambiente de trabalho limpo e isolado
de outros projetos;
2. Deixe claro o que é configuração de desenvolvi...
6. Use signals [com cautela];
7. Sobrescreva o ModelManager;
8. Não repita-se (don't repeat yourself);
9. Teste TUDO.
?
github.com/filipeximenes
bitbucket.org/filipeximenes
filipeximenes@gmail.com
twitter.com/xima
Upcoming SlideShare
Loading in...5
×

Boas práticas de django

2,035

Published on

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.

Published in: Technology
3 Comments
10 Likes
Statistics
Notes
  • @collopy Valeu a correção! Vou apresentar essa palestra na Python Brasil e ai logo depois subo as correções!

    Sobre o settings, se colocar o import no init, as configurações locais vão ser sempre carregadas. A idéia aqui é realmente ter configurações isoladas que serão carregadas cada uma em seu devido ambiente. No slide 22 deixei como padrão o settings local pra facilitar durante o desenvolvimento. No ambiente de produção, o ideal é que você configure a variável de ambiente: DJANGO_SETTINGS_MODULE='my_project.settings.production'. Dessa forma, só as configurações de produção são carregadas então não tem perigo de carregar indevidamente alguma configuração local.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Oi Filipe, nesse slide 24, acho que o run server é junto.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Oi Filipe, nesse slide 18, não poderia ter um arquivo settings/__init__.py com um from local import *?
    To curtindo a apresentação =)
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
2,035
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
100
Comments
3
Likes
10
Embeds 0
No embeds

No notes for slide

Transcript of "Boas práticas de django"

  1. 1. Filipe Ximenes Boas práticas de Django
  2. 2. Filipe Ximenes •Fundador da Vinta; •Desenvolvedor Web; •Apaixonado por aprender; •Fã de comunidades de Sofware Livre; •Curioso de empreendedorismo.
  3. 3. Boas práticas de Django
  4. 4. Boas práticas Boas 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.
  5. 5. Boas práticas deDjango
  6. 6. Django Django é o framework web para perfeccionistas com prazos.
  7. 7. • Não é mágica; • Não é difícil; • Não requer mais do que conhecer Django.
  8. 8. • Requer vontade; • Requer prática; • Os resultados são sensíveis.
  9. 9. 1. Mantenha seu ambiente de trabalho limpo e isolado de outros projetos
  10. 10. Virtualenv pip install virtualenv virtualenv .venv source .venv/bin/activate http://www.virtualenv.org/
  11. 11. 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/
  12. 12. 2. Deixe claro o que é configuração de desenvolvimento e o que é configuração de produção
  13. 13. 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
  14. 14. settings/local.py & settings/production.py from .base import *
  15. 15. 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.
  16. 16. 3. Facilite a sua vida e a de quem está iniciando no projeto
  17. 17. manage.py & wsgi.py os.environ.setdefault( "DJANGO_SETTINGS_MODULE", "my_project.settings.local" )
  18. 18. Em produção export DJANGO_SETTINGS_MODULE= “my_project.settings.production”
  19. 19. 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
  20. 20. 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
  21. 21. README.md #Meu Projeto Este é um projeto exemplo para falar sobre boas práticas de Django ##Instalação Para rodar o projeto localmente você precisa apenas executar o comando: ``` make setup ```
  22. 22. 4. Sempre que puder, crie novos apps
  23. 23. 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.
  24. 24. 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.
  25. 25. Correto
  26. 26. Errado
  27. 27. 5. Não ignore o User do Django
  28. 28. User do Django • Facilidade; • Compatibilidade: • Com o Django; • Com apps de terceiros.
  29. 29. AbstractUser AbstractBaseUser •Adicione novos campos: •Adicione e remova campos: https://docs.djangoproject.com/en/dev/topics/auth/customizing/ #extending-django-s-default-user http://catherinetenajeros.blogspot.com.br/2013/03/django-15- subclass-abstractbaseuser.html
  30. 30. 6. Use signals [com cautela]
  31. 31. models.py class MyUser(...): ... from .signals import *
  32. 32. 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(...)
  33. 33. 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)
  34. 34. 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.
  35. 35. 7. Sobrescreva o ModelManager
  36. 36. É 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
  37. 37. 8. Não repita-se (don't repeat yourself)
  38. 38. Templates <htlm> <head> <title>Home</title> ... <head> <header> ... </header> <div> ... </div> <footer> ... </footer> </html> home.html
  39. 39. Templates <htlm> <head> <title>Contato</title> ... <head> <header> ... </header> <div> ... </div> <footer> ... </footer> </html> contato.html
  40. 40. Templates Blocks <htlm> <head> <title> {% block title %}My Project{% endblock %} </title> ... <head> <header> ... </header> <div> {% block content %} {% endblock %} </div> <footer> ... </footer> </html> base.html
  41. 41. 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
  42. 42. 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()
  43. 43. Mixins class SoftDeleteMixin(models.Model): class Meta: abstract = True is_deleted = models.BooleanField( default=False) def delete(self): self.is_deleted = True self.save()
  44. 44. Mixins class MeuUser(SoftDeleteMixin): ... class OutroModel(SoftDeleteMixin): ...
  45. 45. 9. Teste TUDO
  46. 46. 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
  47. 47. Model Mommy # para instalar pip install model_mommy # No seu arquivo de testes kid = mommy.make('family.Kid') https://github.com/vandersonmota/model_mommy
  48. 48. 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.
  49. 49. 6. Use signals [com cautela]; 7. Sobrescreva o ModelManager; 8. Não repita-se (don't repeat yourself); 9. Teste TUDO.
  50. 50. ? github.com/filipeximenes bitbucket.org/filipeximenes filipeximenes@gmail.com twitter.com/xima
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×