Django vs Flask: Qual Framework Escolher? | Python Brasil
Django e Flask são os dois frameworks web mais populares do ecossistema Python. Django é o “batteries included” — tudo vem pronto. Flask é o microframework — você monta como quiser. Neste comparativo, vamos te ajudar a escolher o certo para seu projeto.
Tabela Comparativa
| Aspecto | Django | Flask |
|---|---|---|
| Tipo | Full-stack | Microframework |
| Filosofia | Batteries included | Faça do seu jeito |
| ORM | Django ORM (incluso) | SQLAlchemy (separado) |
| Admin | Django Admin (incluso) | Flask-Admin (extensão) |
| Autenticação | Inclusa | Flask-Login (extensão) |
| Migrations | Inclusas (manage.py migrate) | Flask-Migrate/Alembic |
| Templates | Django Templates (incluso) | Jinja2 (incluso) |
| Curva de aprendizado | Mais íngreme | Mais suave |
| Flexibilidade | Opinativo | Livre |
| Performance | Boa | Boa (leve vantagem) |
| Ideal para | Apps completas, CMS, e-commerce | APIs, microserviços, protótipos |
| Mercado no Brasil | Muito forte | Forte |
Arquitetura: Monolito vs Microframework
Django: Tudo Incluído
Django segue o padrão MVT (Model-View-Template) e vem com:
- ORM completo com migrations automáticas
- Sistema de autenticação e autorização
- Django Admin — painel administrativo automático
- Proteção contra CSRF, XSS, SQL injection
- Sistema de URLs com namespaces
- Internacionalização (i18n) embutida
- Cache framework
- Sistema de e-mails
# Django — projeto funcional em poucos minutos
# models.py
from django.db import models
class Produto(models.Model):
nome = models.CharField(max_length=200)
preco = models.DecimalField(max_digits=10, decimal_places=2)
estoque = models.PositiveIntegerField(default=0)
ativo = models.BooleanField(default=True)
criado_em = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ["-criado_em"]
verbose_name_plural = "Produtos"
def __str__(self):
return f"{self.nome} - R$ {self.preco}"
@property
def disponivel(self):
return self.ativo and self.estoque > 0
# admin.py — admin pronto em 3 linhas
from django.contrib import admin
from .models import Produto
@admin.register(Produto)
class ProdutoAdmin(admin.ModelAdmin):
list_display = ["nome", "preco", "estoque", "ativo"]
list_filter = ["ativo"]
search_fields = ["nome"]
# views.py
from django.views.generic import ListView, DetailView
from .models import Produto
class ProdutoListView(ListView):
model = Produto
queryset = Produto.objects.filter(ativo=True)
template_name = "produtos/lista.html"
paginate_by = 12
context_object_name = "produtos"
class ProdutoDetailView(DetailView):
model = Produto
template_name = "produtos/detalhe.html"
O Django Admin sozinho justifica usar Django para projetos que precisam de CRUD administrativo.
Flask: Monte o Seu
Flask te dá o mínimo e você adiciona o que precisa:
# Flask — controle total sobre cada componente
from flask import Flask, render_template, jsonify, request
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///loja.db"
db = SQLAlchemy(app)
migrate = Migrate(app, db)
class Produto(db.Model):
id = db.Column(db.Integer, primary_key=True)
nome = db.Column(db.String(200), nullable=False)
preco = db.Column(db.Float, nullable=False)
estoque = db.Column(db.Integer, default=0)
ativo = db.Column(db.Boolean, default=True)
def to_dict(self):
return {
"id": self.id,
"nome": self.nome,
"preco": self.preco,
"estoque": self.estoque,
}
@app.route("/")
def listar_produtos():
produtos = Produto.query.filter_by(ativo=True).all()
return render_template("produtos/lista.html", produtos=produtos)
@app.route("/api/produtos")
def api_produtos():
page = request.args.get("page", 1, type=int)
produtos = Produto.query.filter_by(ativo=True).paginate(
page=page, per_page=12
)
return jsonify([p.to_dict() for p in produtos.items])
Flask é mais explícito — você vê cada peça montada. Isso é uma vantagem para aprendizado e projetos pequenos, mas requer mais decisões em projetos grandes.
APIs REST
Django REST Framework:
# serializers.py
from rest_framework import serializers
from .models import Produto
class ProdutoSerializer(serializers.ModelSerializer):
class Meta:
model = Produto
fields = ["id", "nome", "preco", "estoque", "ativo"]
# viewsets.py
from rest_framework import viewsets
from .models import Produto
from .serializers import ProdutoSerializer
class ProdutoViewSet(viewsets.ModelViewSet):
queryset = Produto.objects.filter(ativo=True)
serializer_class = ProdutoSerializer
filterset_fields = ["ativo"]
search_fields = ["nome"]
ordering = ["-criado_em"]
Flask com Marshmallow:
from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema
class ProdutoSchema(SQLAlchemyAutoSchema):
class Meta:
model = Produto
load_instance = True
produto_schema = ProdutoSchema()
produtos_schema = ProdutoSchema(many=True)
@app.route("/api/produtos", methods=["GET"])
def listar():
produtos = Produto.query.filter_by(ativo=True).all()
return jsonify(produtos_schema.dump(produtos))
@app.route("/api/produtos", methods=["POST"])
def criar():
produto = produto_schema.load(request.json, session=db.session)
db.session.add(produto)
db.session.commit()
return jsonify(produto_schema.dump(produto)), 201
Para APIs REST puras, considere também FastAPI — que supera ambos em velocidade de desenvolvimento e performance.
Performance
| Benchmark | Django | Flask |
|---|---|---|
| Requests/s (hello world) | ~3.000 | ~4.500 |
| Requests/s (DB query) | ~1.500 | ~2.000 |
| Latência média | ~8ms | ~5ms |
| Uso de memória (idle) | ~50MB | ~20MB |
Flask é ligeiramente mais rápido por ser mais leve, mas na prática a diferença é negligenciável — o gargalo geralmente é o banco de dados, não o framework.
Para alta performance, considere FastAPI com async que é significativamente mais rápido que ambos.
Ecossistema de Extensões
Django vem com:
- Admin, ORM, migrations, autenticação, cache, e-mails, i18n, formulários, middleware, signals, management commands
Flask precisa de extensões para:
| Funcionalidade | Extensão Flask |
|---|---|
| ORM | Flask-SQLAlchemy |
| Migrations | Flask-Migrate |
| Auth | Flask-Login + Flask-Security |
| Admin | Flask-Admin |
| Forms | WTForms |
| API REST | Flask-RESTful ou Marshmallow |
| CORS | Flask-CORS |
| Cache | Flask-Caching |
A vantagem de Flask é que você escolhe cada componente. A desvantagem é que você precisa escolher e integrar cada componente.
Mercado de Trabalho no Brasil
Django
- Framework Python web mais demandado no Brasil
- Presente em empresas grandes e startups
- Muitas vagas em empresas brasileiras que usam Python
- Ideal para aplicações que precisam de admin e gestão de dados
Flask
- Popular em microserviços e APIs
- Comum em startups e projetos menores
- Geralmente aparece junto com Docker e cloud
- Menos vagas dedicadas que Django, mas forte demanda
Confira as vagas Python disponíveis para ver a demanda real no mercado.
Quando Usar Cada Um
Escolha Django se:
- Precisa de admin panel rápido
- Vai construir uma aplicação completa (CMS, e-commerce, SaaS)
- Quer produtividade máxima com tudo pronto
- A equipe é grande e precisa de convenções consistentes
- Precisa de autenticação e autorização robustas
- O projeto vai crescer ao longo dos anos
Escolha Flask se:
- Vai construir uma API pequena ou microserviço
- Quer controle total sobre cada componente
- O projeto é simples e não precisa de admin
- Está aprendendo web development com Python
- Vai integrar com um frontend separado (React, Vue)
- Precisa de leveza e startup rápido
Prós e Contras
Django
Prós:
- Tudo incluído — desenvolvimento rápido
- Django Admin é insubstituível
- ORM poderoso com migrations automáticas
- Segurança built-in (CSRF, XSS, SQL injection)
- Documentação excepcional
- Comunidade gigante
Contras:
- Opinativo — difícil fugir do “jeito Django”
- Overhead para projetos simples
- Curva de aprendizado mais íngreme
- Monolítico por padrão
Flask
Prós:
- Simples e fácil de aprender
- Flexibilidade total
- Leve e rápido para iniciar
- Ideal para microserviços
- Fácil de entender o código por completo
Contras:
- Precisa montar tudo manualmente
- Decisões demais em projetos grandes
- Extensões podem conflitar
- Sem admin built-in
- Menos estrutura = mais chances de código desorganizado
Conclusão — Qual Escolher?
Para aplicações web completas com admin, autenticação e gestão de dados, Django é a escolha certa. Para APIs, microserviços e projetos leves, Flask ou FastAPI são melhores opções.
Se está começando, Flask é mais fácil de entender (menos mágica). Mas para ser produtivo em projetos reais, Django vale o investimento na curva de aprendizado.
Explore nossos guias de Django e Flask para começar.
🔗 Veja também: FastAPI vs Django, Pandas vs Polars e nossos guias práticos.
Perguntas Frequentes
Django está desatualizado?
Não. Django 5.x trouxe async views, formulários melhorados e computed fields. O framework continua evoluindo e é amplamente adotado.
Flask é bom para projetos grandes?
Pode ser, mas exige mais disciplina na organização. Blueprints ajudam a estruturar, mas em projetos muito grandes, Django ou FastAPI podem ser melhores escolhas.
Posso migrar de Flask para Django?
Sim, mas dá trabalho. Os dois têm ORM e sistema de rotas diferentes. Vale avaliar se a migração compensa ou se é melhor criar um novo projeto em Django.
E o FastAPI?
FastAPI é excelente para APIs modernas com async e validação automática via Pydantic. Se o seu projeto é puramente uma API, FastAPI pode ser melhor que ambos. Veja nosso comparativo FastAPI vs Django.