SlideShare uma empresa Scribd logo
1 de 50
Baixar para ler offline
Filipe Ximenes
Boas práticas de
Django
Filipe Ximenes
•Fundador da Vinta;
•Desenvolvedor Web;
•Apaixonado por aprender;
•Fã de comunidades de Sofware Livre;
•Curioso de empreendedorismo.
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
software tem aprendido ao longo do tempo
para melhorar a qualidade das aplicações e
simplificar sua manutenção.
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/local/bin/virtualenvwrapper.sh" 
>> ~/.bash_profile
mkvirtualenv my_project
workon my_project
deactivate
http://virtualenvwrapper.readthedocs.org/
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/
base.py
local.py
production.py
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 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.
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:
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
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 práticas de Django
##Instalação
Para rodar o projeto localmente você
precisa apenas executar o comando:
```
make setup
```
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;
• Tente isolar o máximo possível, e reduzir
dependências.
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.
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/topics/auth/customizing/
#extending-django-s-default-user
http://catherinetenajeros.blogspot.com.br/2013/03/django-15-
subclass-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 ação secundária,
não 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
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
8. Não repita-se (don't repeat yourself)
Templates
<htlm>
<head>
<title>Home</title>
...
<head>
<header>
...
</header>
<div>
...
</div>
<footer>
...
</footer>
</html>
home.html
Templates
<htlm>
<head>
<title>Contato</title>
...
<head>
<header>
...
</header>
<div>
...
</div>
<footer>
...
</footer>
</html>
contato.html
Templates Blocks
<htlm>
<head>
<title>
{% block title %}My Project{% endblock %}
</title>
...
<head>
<header>
...
</header>
<div>
{% block content %}
{% endblock %}
</div>
<footer>
...
</footer>
</html>
base.html
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
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 é 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.
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

Mais conteúdo relacionado

Mais procurados

Aula 4 - Teste de mesa
Aula 4 - Teste de mesaAula 4 - Teste de mesa
Aula 4 - Teste de mesa
Pacc UAB
 
Logica Algoritmo 07 Subalgoritmos
Logica Algoritmo 07 SubalgoritmosLogica Algoritmo 07 Subalgoritmos
Logica Algoritmo 07 Subalgoritmos
Regis Magalhães
 
Tutorial Django + Python
Tutorial Django + PythonTutorial Django + Python
Tutorial Django + Python
Mateus Padua
 
Logica Algoritmo 05 Repeticao
Logica Algoritmo 05 RepeticaoLogica Algoritmo 05 Repeticao
Logica Algoritmo 05 Repeticao
Regis Magalhães
 

Mais procurados (20)

Documentação de Arquitetura de Software Aplicando o C4 Model
Documentação de Arquitetura  de Software Aplicando o C4 ModelDocumentação de Arquitetura  de Software Aplicando o C4 Model
Documentação de Arquitetura de Software Aplicando o C4 Model
 
Introdução básica ao JavaScript
Introdução básica ao JavaScriptIntrodução básica ao JavaScript
Introdução básica ao JavaScript
 
Aula 4 - Teste de mesa
Aula 4 - Teste de mesaAula 4 - Teste de mesa
Aula 4 - Teste de mesa
 
[Curso Java Basico - Exceptions] Aula 47: try, catch
[Curso Java Basico - Exceptions] Aula 47: try, catch[Curso Java Basico - Exceptions] Aula 47: try, catch
[Curso Java Basico - Exceptions] Aula 47: try, catch
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01
 
Logica Algoritmo 07 Subalgoritmos
Logica Algoritmo 07 SubalgoritmosLogica Algoritmo 07 Subalgoritmos
Logica Algoritmo 07 Subalgoritmos
 
Curso de Python e Django
Curso de Python e DjangoCurso de Python e Django
Curso de Python e Django
 
Aula 07 - Visualg e Pseudocódigo
Aula 07 - Visualg e PseudocódigoAula 07 - Visualg e Pseudocódigo
Aula 07 - Visualg e Pseudocódigo
 
Aula 06 - Diagrama de classes
Aula 06 - Diagrama de classesAula 06 - Diagrama de classes
Aula 06 - Diagrama de classes
 
Lista de exercícios em Bash (resolvida)
Lista de exercícios em Bash (resolvida) Lista de exercícios em Bash (resolvida)
Lista de exercícios em Bash (resolvida)
 
Introduction To Django
Introduction To DjangoIntroduction To Django
Introduction To Django
 
[PYTHONSUL2018] Apresentação do Tutorial - Automação de Testes com Robot Fram...
[PYTHONSUL2018] Apresentação do Tutorial - Automação de Testes com Robot Fram...[PYTHONSUL2018] Apresentação do Tutorial - Automação de Testes com Robot Fram...
[PYTHONSUL2018] Apresentação do Tutorial - Automação de Testes com Robot Fram...
 
Java básico - Módulo 05 - Estruturas de Repetição
Java  básico - Módulo 05 - Estruturas de RepetiçãoJava  básico - Módulo 05 - Estruturas de Repetição
Java básico - Módulo 05 - Estruturas de Repetição
 
Publish-Subscribe Middlewares
Publish-Subscribe MiddlewaresPublish-Subscribe Middlewares
Publish-Subscribe Middlewares
 
Tutorial Django + Python
Tutorial Django + PythonTutorial Django + Python
Tutorial Django + Python
 
Linguagem C - Vetores
Linguagem C - VetoresLinguagem C - Vetores
Linguagem C - Vetores
 
Logica Algoritmo 05 Repeticao
Logica Algoritmo 05 RepeticaoLogica Algoritmo 05 Repeticao
Logica Algoritmo 05 Repeticao
 
Introdução ao RUP
Introdução ao RUPIntrodução ao RUP
Introdução ao RUP
 
Introduction to Bootstrap: Design for Developers
Introduction to Bootstrap: Design for DevelopersIntroduction to Bootstrap: Design for Developers
Introduction to Bootstrap: Design for Developers
 
Php ppt
Php pptPhp ppt
Php ppt
 

Destaque

Introdução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de SoftwareIntrodução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de Software
Willian Carminato
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projeto
ejdn1
 

Destaque (20)

DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APISDJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
 
Como fazer boas libs
Como fazer boas libs Como fazer boas libs
Como fazer boas libs
 
Junho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em pythonJunho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em python
 
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
 
Padrão de Projetos singleton
Padrão de Projetos singletonPadrão de Projetos singleton
Padrão de Projetos singleton
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebProposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
 
Django, Framework Python para desenvolvimento web
Django, Framework Python para desenvolvimento webDjango, Framework Python para desenvolvimento web
Django, Framework Python para desenvolvimento web
 
Mini curso introdutório ao Django
Mini curso introdutório ao DjangoMini curso introdutório ao Django
Mini curso introdutório ao Django
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de django
 
O que é esse tal de rest? [PyBR2016]
O que é esse tal de rest? [PyBR2016]O que é esse tal de rest? [PyBR2016]
O que é esse tal de rest? [PyBR2016]
 
Django rest framework tips and tricks
Django rest framework   tips and tricksDjango rest framework   tips and tricks
Django rest framework tips and tricks
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
 
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilComo um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
 
Padrão Fachada
Padrão FachadaPadrão Fachada
Padrão Fachada
 
Introdução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de SoftwareIntrodução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de Software
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projeto
 
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
 

Semelhante a Boas práticas de django

Uma implementação de suporte a
Uma implementação de suporte a Uma implementação de suporte a
Uma implementação de suporte a
Rômulo Jales
 

Semelhante a Boas práticas de django (20)

TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fisl
 
Tdd em django sem desculpas versao final
Tdd em django sem desculpas versao finalTdd em django sem desculpas versao final
Tdd em django sem desculpas versao final
 
Python 06
Python 06Python 06
Python 06
 
Implementação de
Implementação de Implementação de
Implementação de
 
Treinamento Básico de Django
Treinamento Básico de DjangoTreinamento Básico de Django
Treinamento Básico de Django
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend Framework
 
Boas práticas para deploy contínuo com drupal
Boas práticas para deploy contínuo com drupalBoas práticas para deploy contínuo com drupal
Boas práticas para deploy contínuo com drupal
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLI
 
Sweet Child O' Themes
Sweet Child O' ThemesSweet Child O' Themes
Sweet Child O' Themes
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
 
Técnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em djangoTécnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em django
 
Uma implementação de suporte a
Uma implementação de suporte a Uma implementação de suporte a
Uma implementação de suporte a
 
Xdebug seus problemas acabaram - tdc floripa 2017
Xdebug   seus problemas acabaram - tdc floripa 2017Xdebug   seus problemas acabaram - tdc floripa 2017
Xdebug seus problemas acabaram - tdc floripa 2017
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Django Básico
Django BásicoDjango Básico
Django Básico
 
Construção e provisionamento de ambientes de desenvolvimento virtualizados
Construção e provisionamento de ambientes  de desenvolvimento virtualizadosConstrução e provisionamento de ambientes  de desenvolvimento virtualizados
Construção e provisionamento de ambientes de desenvolvimento virtualizados
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 

Mais de Filipe Ximenes

Mais de Filipe Ximenes (7)

Multitenant applications: How and Why
Multitenant applications: How and WhyMultitenant applications: How and Why
Multitenant applications: How and Why
 
Tasks: you gotta know how to run them
Tasks: you gotta know how to run themTasks: you gotta know how to run them
Tasks: you gotta know how to run them
 
[Quase] Tudo que você precisa saber sobre tarefas assíncronas
[Quase] Tudo que você precisa saber sobre  tarefas assíncronas[Quase] Tudo que você precisa saber sobre  tarefas assíncronas
[Quase] Tudo que você precisa saber sobre tarefas assíncronas
 
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
 
Usando tapioca para acessar APIs web [PyBR11]
Usando tapioca para acessar APIs web [PyBR11]Usando tapioca para acessar APIs web [PyBR11]
Usando tapioca para acessar APIs web [PyBR11]
 
Expressões idiomáticas do python
Expressões idiomáticas do pythonExpressões idiomáticas do python
Expressões idiomáticas do python
 
Migrando do App Engine para o Heroku
Migrando do App Engine para o HerokuMigrando do App Engine para o Heroku
Migrando do App Engine para o Heroku
 

Boas práticas de django