O Django é o framework web mais popular e completo escrito em Python. Desenvolvido originalmente para impulsionar o jornal Lawrence Journal-World, hoje é usado por empresas como Instagram, Pinterest, Spotify e Dropbox para construir aplicações web robustas e escaláveis.
Neste guia completo, você aprenderá tudo o que precisa para começar a desenvolver com Django, desde conceitos básicos até técnicas avançadas que tornarão um desenvolvedor proficiente.
O Que é Django?
Django é um framework web de alto nível totalmente escrito em Python que segue a filosofia "baterias inclusas". Isso significa que ele já vem com tudo que você precisa para construir uma aplicação web completa — desde autenticação até gerenciamento de banco de dados, desde interface de administração até processamento de formulários.
A filosofia do Django é baseada em alguns princípios fundamentais que o tornam únicos:
- DRY (Don't Repeat Yourself): Django incentiva a reutilização de código através de sua arquitetura baseada em apps
- MTV (Model-Template-View): Um padrão de arquitetura claro que separa responsabilidades
- Pragmatismo: O framework foi projetado para ajudar desenvolvedores a resolver problemas do mundo real rapidamente
- Explícito é melhor que implícito: Código claro e legível é preferível à "mágica"
According to the official Django documentation, o framework foi lançado em 2005 e desde então tem sido mantido por uma comunidade ativa de desenvolvedores que contribuem regularmente com melhorias e atualizações.
Por Que Usar Django?
Existem muitas razões para escolher Django como seu framework web. Vamos explorar as principais vantagens que o tornam superior a outros frameworks Python como Flask ou FastAPI.
1. Baterias Includas (Batteries Included)
Ao contrário de frameworks leves, Django vem com um conjunto abrangente de recursos integrados que de outra forma exigiriam bibliotecas adicionais e configuração. Isso inclui:
- Sistema de autenticação de usuários completo
- Interface de administração automática (Django Admin)
- Sistema de formulários com validação
- Tratamento de upload de arquivos
- Sistema de internacionalização (i18n)
- Proteção contra vulnerabilidades comuns (CSRF, XSS, SQL Injection)
According to Real Python, a "batteries included" approach significa que você pode focar no que realmente importa: construir as funcionalidades únicas da sua aplicação, não reinventar a roda.
2. ORM Poderoso
O Django ORM (Object-Relational Mapper) is one of its most powerful features, permitindo que você interaja with databases usando objetos Python em vez de escrever SQL manualmente. Isso provides several benefits:
from django.db import models
class Produto(models.Model):
nome = models.CharField(max_length=200)
preco = models.DecimalField(max_digits=10, decimal_places=2)
descricao = models.TextField()
data_criacao = models.DateTimeField(auto_now_add=True)
categoria = models.ForeignKey('Categoria', on_delete=models.CASCADE)
class Meta:
ordering = ['-data_criacao']
def __str__(self):
return self.nome
Com o ORM, você can perform complex database operations sem escrever uma única linha de SQL:
# Criar um produto
produto = Produto.objects.create(
nome="Notebook Python",
preco=3500.00,
descricao="Perfeito para desenvolvedores",
categoria=categoria
)
# Buscar produtos com filtros avançados
produtos = Produto.objects.filter(
preco__lte=5000
).filter(
categoria__nome__contains="Eletrônicos"
).order_by('-preco')
# Agregações
from django.db.models import Avg, Count
media_precos = Produto.objects.aggregate(Avg('preco'))
According to Django Documentation, o ORM supports multiple database backends including PostgreSQL, MySQL, SQLite, e Oracle.
3. Django Admin
Uma das features mais impressionantes do Django é o Admin interface automatically generated. Em questão de minutos, você pode ter um painel de administração fully functional para gerenciar seus dados.
# models.py
from django.db import models
class Artigo(models.Model):
titulo = models.CharField(max_length=200)
conteudo = models.TextField()
published = models.BooleanField(default=False)
data_publicacao = models.DateTimeField()
def __str__(self):
return self.titulo
# admin.py
from django.contrib import admin
from .models import Artigo
@admin.register(Artigo)
class ArtigoAdmin(admin.ModelAdmin):
list_display = ['titulo', 'published', 'data_publicacao']
list_filter = ['published', 'data_publicacao']
search_fields = ['titulo', 'conteudo']
date_hierarchy = 'data_publicacao'
Com apenas essas few linhas, você terá um admin where pode listar, filtrar, buscar, editar e criar artigos. O Django Admin também supports inline editing, actions em massa, e muito mais.
4. Segurança
Django was designed with security in mind, protecting your applications against common vulnerabilities by default. According to OWASP, o Django includes built-in protection against:
- SQL Injection: Parameterized queries prevent SQL injection attacks
- Cross-Site Scripting (XSS): Template auto-escaping protects against XSS
- Cross-Site Request Forgery (CSRF): CSRF tokens são automaticamente included in forms
- Clickjacking: X-Frame-Options middleware prevents clickjacking
- Password Storage: Secure password hashing with PBKDF2 by default
5. Comunidade e Ecossistema
Com mais de 15 years de existência, Django tem uma comunidade massive e um ecossistema rico de packages. Você pode encontrar packages para virtually qualquer functionality que precise, from SMS sending to payment processing.
According to PyPI, existem thousands de packages Django disponíveis, cobrindo áreas como:
- Authentication (django-allauth, django-rest-auth)
- APIs (Django REST Framework, GraphQL)
- Admin themes (django-jet, django-grappelli)
- E-commerce (django-oscar, saleor)
- CMS (Wagtail, django-cms)
Instalando Django
Getting started with Django is straightforward. Você pode install using pip:
# Criar ambiente virtual (recomendado)
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
# Instalar Django
pip install django
# Verificar instalação
django-admin --version
Alternativamente, você pode create a new Django project usando django-admin:
django-admin startproject meuprojeto
cd meuprojeto
python manage.py runserver
Isso will create a basic Django project structure. According to Python.org, é altamente recomendado usar ambientes virtuais para isol your Django projects and avoid dependency conflicts.
Entendendo a Estrutura do Django
Um projeto Django é organized em uma estruturahierárquica que pode parecer complexa no beginning, mas makes perfect sense once você entende como as peças se encaixam.
Projetos vs Apps
É crucial entender a diferença between project e app em Django:
- Project: A entire application configuration. É o container que holds todas as configurações do seu site
- <App: A reusable component que performs a specific functionality. Pode ser reutilizado em diferentes projects
Por exemplo, um project de e-commerce might have apps como "catalog", "cart", "orders", e "payments".
# Criar um app
python manage.py startapp blog
Arquitetura MTV
Django follows o Model-Template-View (MTV) pattern, que é similar ao MVC mas com responsibilities稍微 diferentes:
- Model: Define a estrutura dos dados e interage com o banco
- Template: Responsável pela presentation layer (HTML)
- View: Contém a lógica de negócio e processa requests
According to MDN Web Docs, essa Separation of Concerns makes código mais maintainable e testável.
Criando Sua Primeira Aplicação Django
Vamos criar uma aplicação simples de blog para demonstrar os conceitos fundamentais do Django. Este exemplo will cover models, views, URLs, e templates.
Step 1: Configurar o Banco de Dados
Django uses SQLite por padrão, que é perfect para development. Para setup, você precisa run migrations:
python manage.py migrate
Isso will create all the necessary database tables, including those for users, sessions, e auth. Você também pode customize seu banco de dados editando settings.py:
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '5432',
}
}
According to W3Schools, PostgreSQL é highly recommended para production environments devido à sua robustness e scalability.
Step 2: Criar Models
Models são a foundation of your Django application. Vamos create a simple blog model:
# blog/models.py
from django.db import models
from django.contrib.auth.models import User
class Categoria(models.Model):
nome = models.CharField(max_length=100)
slug = models.SlugField(unique=True)
descricao = models.TextField(blank=True)
class Meta:
verbose_name_plural = "Categorias"
def __str__(self):
return self.nome
class Post(models.Model):
titulo = models.CharField(max_length=200)
slug = models.SlugField(unique=True)
conteudo = models.TextField()
autor = models.ForeignKey(User, on_delete=models.CASCADE)
categoria = models.ForeignKey(Categoria, on_delete=models.SET_NULL, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
published = models.BooleanField(default=False)
class Meta:
ordering = ['-created_at']
def __str__(self):
return self.titulo
After creating your models, você precisa create migrations:
python manage.py makemigrations
python manage.py migrate
Step 3: Criar Views
Views são onde a lógica da aplicação lives. Django supports both function-based views (FBV) e class-based views (CBV):
# blog/views.py
from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView
from django.models import Post
from .models import Categoria
class PostListView(ListView):
model = Post
template_name = 'blog/post_list.html'
context_object_name = 'posts'
paginate_by = 10
def get_queryset(self):
return Post.objects.filter(published=True)
class PostDetailView(DetailView):
model = Post
template_name = 'blog/post_detail.html'
context_object_name = 'post'
def post_por_categoria(request, slug):
categoria = get_object_or_404(Categoria, slug=slug)
posts = Post.objects.filter(published=True, categoria=categoria)
return render(request, 'blog/post_list.html', {
'posts': posts,
'categoria': categoria
})
Step 4: Configurar URLs
URL configuration é onde você map URLs to views:
# blog/urls.py
from django.urls import path
from .views import PostListView, PostDetailView, post_por_categoria
urlpatterns = [
path('', PostListView.as_view(), name='post_list'),
path('post/<slug:slug>/', PostDetailView.as_view(), name='post_detail'),
path('categoria/<slug:slug>/', post_por_categoria, name='post_por_categoria'),
]
# meuprojeto/urls.py (principal)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
]
Step 5: Criar Templates
Templates são onde você define o HTML que será rendered. Django template language é powerful but easy to learn:
<!-- templates/blog/post_list.html -->
{% extends 'base.html' %}
{% block content %}
<h1>Blog</h1>
{% for post in posts %}
<article class="post-card">
<h2><a href="{% url 'post_detail' post.slug %}">{{ post.titulo }}</a></h2>
<p class="meta">
Por {{ post.autor.username }} em {{ post.created_at|date:"d/m/Y" }}
</p>
<p>{{ post.conteudo|truncatewords:50 }}</p>
<a href="{% url 'post_detail' post.slug %}">Ler mais...</a>
</article>
{% empty %}
<p>Nenhum post encontrado.</p>
{% endfor %}
{% if page_obj.has_other_pages %}
<div class="pagination">
{% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}">Anterior</a>
{% endif %}
<span>Página {{ page_obj.number }} de {{ page_obj.paginator.num_pages }}</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">Próxima</a>
{% endif %}
</div>
{% endif %}
{% endblock %}
Django REST Framework
Para criar APIs RESTful com Django, o Django REST Framework (DRF) é a escolha mais popular. Ele extends Django's functionality to make building APIs straightforward.
# requirements.txt
djangorestframework>=3.14.0
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
]
# serializers.py
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
autor = serializers.StringRelatedField()
categoria = serializers.StringRelatedField()
class Meta:
model = Post
fields = ['id', 'titulo', 'slug', 'conteudo', 'autor', 'categoria', 'created_at']
# views.py
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from .models import Post
from .serializers import PostSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.filter(published=True)
serializer_class = PostSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
def perform_create(self, serializer):
serializer.save(autor=self.request.user)
# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostViewSet
router = DefaultRouter()
router.register(r'posts', PostViewSet)
urlpatterns = [
path('api/', include(router.urls)),
]
According to Django REST Framework documentation, DRF provides features like authentication, serialization, validation, e viewsets que make building APIs much easier.
Autenticação e Autorização
Django has a built-in authentication system that handles users, groups, permissions, e sessions. Let's explore how to use it effectively.
Criando Sistema de Login
# views.py
from django.contrib.auth import login, authenticate, logout
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
def login_view(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('home')
else:
return render(request, 'login.html', {'error': 'Invalid credentials'})
return render(request, 'login.html')
@login_required
def profile_view(request):
return render(request, 'profile.html', {'user': request.user})
def logout_view(request):
logout(request)
return redirect('home')
<!-- templates/registration/login.html -->
<form method="post">
{% csrf_token %}
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Entrar</button>
</form>
Permissões Customizadas
Você pode create custom permissions para controlar access to views:
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.autor == request.user or request.user.is_staff
Testando Aplicações Django
Testing é essencial para maintain código de quality. Django provides um testing framework poderoso integrado ao unittest.
# blog/tests.py
from django.test import TestCase
from django.contrib.auth.models import User
from .models import Post, Categoria
from django.utils import timezone
from django.test import Client
class PostModelTest(TestCase):
def setUp(self):
self.user = User.objects.create_user(
username='testuser',
password='testpass123'
)
self.categoria = Categoria.objects.create(
nome='Tecnologia',
slug='tecnologia'
)
def test_post_creation(self):
post = Post.objects.create(
titulo='Test Post',
slug='test-post',
conteudo='Conteúdo de teste',
autor=self.user,
categoria=self.categoria,
published=True
)
self.assertEqual(post.__str__(), 'Test Post')
self.assertTrue(post.published)
class PostViewTest(TestCase):
def setUp(self):
self.client = Client()
def test_post_list_view(self):
response = self.client.get('/blog/')
self.assertEqual(response.status_code, 200)
Para executar os testes:
python manage.py test
According to Django Testing Documentation, é uma best practice escrever testes para todas as funcionalidades críticas da sua aplicação.
Deployment
Quando sua aplicação está ready para production, há várias options de deployment. Vamos cover as mais populares.
Usando Gunicorn
Gunicorn é um WSGI HTTP server widely used with Django:
pip install gunicorn
# Executar com Gunicorn
gunicorn meuprojeto.wsgi:application --bind 0.0.0.0:8000
Docker
Containerizing sua aplicação Django with Docker is highly recommended:
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "meuprojeto.wsgi:application", "--bind", "0.0.0.0:8000"]
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
environment:
- DEBUG=0
- ALLOWED_HOSTS=seusite.com
depends_on:
- db
db:
image: postgres:15
environment:
- POSTGRES_DB=mydb
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
volumes:
- pgdata:/var/lib/postgresql/data
Plataformas de Hosting
Existem várias plataformas onde você pode fazer deploy do seu Django application:
- Render: Easy deployment, good free tier
- Railway: Modern, easy to use
- Heroku: Classic choice, now paid
- DigitalOcean: VPS control, great for self-hosting
According to Stack Overflow, a escolha da plataforma depends on your specific needs like budget, scalability requirements, e technical expertise.
Django vs Outros Frameworks
É importante entender quando usar Django vs outros frameworks Python. Here's a quick comparison:
- vs Flask: Django é mais "batteries included", melhor para aplicações grandes. Flask é mais lightweight, melhor para small projects ou microservices
- vs FastAPI: FastAPI é mais rápido e melhor para APIs. Django é melhor para aplicações full-stack com templating
- vs Pyramid: Pyramid é mais flexível, Django é mais opinionated com decisões de design já tomadas
Para aplicações web tradicionais que need auth, admin, e database interaction, Django geralmente é a melhor escolha.
Próximos Passos
Agora que você aprendeu os fundamentos do Django, here are some next steps para continuar seu aprendizado:
- FastAPI Python — explore outro framework popular para APIs
- Python Requests — aprenda a fazer requisições HTTP
- Pratique criando seus próprios projetos
- Explore packages como django-allauth para autenticação social
- Learn about caching with Redis
- Explore Django Channels para WebSockets
Django é uma skill valioso para qualquer desenvolvedor Python. Com este guia, você tem uma base sólida para começar a build suas próprias aplicações web profissionais. Continue praticando e exploring a documentação oficial para se tornar um expert!