Estrutura de um projeto Django (MTV)¶
No Django, o padrão clássico MVC (Model–View–Controller) é interpretado de forma diferente, resultando no padrão MTV (Model–Template–View).
O “controller” do MVC, no Django, é o próprio framework, que recebe a requisição e a direciona para a view correta com base nas configurações de URL.
Configuração inicial e boas práticas de organização¶
Criar ambiente virtual¶
python3 -m venv .venv
Ativar ambiente virtual¶
Linux/Mac¶
source .venv/bin/activate
# Windows
.venv\Scripts\activate
Instalar Django dentro do ambiente¶
python3 -m pip install Django
Verificar versão instalada¶
python3 -m django --version
Criação de app¶
python manage.py startapp nome_app
Boas práticas¶
1. Usar .env para credenciais e configs sensíveis¶
2. Manter requirements.txt atualizado¶
pip freeze > requirements.txt; lista tudo que tá instalado no teu ambiente virtual (Django, libs extras, etc.) e salva dentro desse arquivo.
3. Criar apps para dividir responsabilidades (ex: users, events, payments)¶
4. Configurar settings separados (dev, prod) quando o projeto crescer¶
5. Usar migrations sempre que alterar modelos¶
São scripts automáticos que o Django gera pra manter o banco de dados sincronizado com os seus modelos (models.py). python manage.py makemigrations, Roda-o; python manage.py migrate, aplica no banco
Exemplo prático¶
class Cliente(models.Model):
nome = models.CharField(max_length=100)
email = models.EmailField(unique=True)
Resumo: migrations = ponte entre o código Python (models) e o banco de dados real.¶
6. Criar superusuário para acessar o admin¶
python manage.py createsuperuser
7. Testar o projeto antes de subir alterações¶
python manage.py test
Models e ORM (Banco de Dados com SQLite)¶
Banco de Dados com SQLite¶
- Por padrão, o Django usa SQLite, que já vem incluído no Python.
- Isso elimina a necessidade de instalar ou configurar sistemas de banco de dados.
- Para criar as tabelas necessárias (apps do usuário e apps padrão do Django), basta rodar:
python manage.py migrate
Esse comando analisa todos os apps ativados em INSTALLED_APPS e cria as tabelas adequadas no banco.
Models no Django¶
- Um Model é a representação de uma estrutura de dados (tabela) no banco.
- Ele é definido como uma classe Python que herda de
django.db.models.Model. - Cada atributo da classe corresponde a uma coluna no banco de dados.
Exemplo clássico (tutorial polls):
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published")
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
- Uma pergunta tem texto e data de publicação.
- Cada opção está ligada a uma pergunta, com texto e contagem de votos.
- O Django gera automaticamente nomes de tabelas (
app_modelname), campos, chaves primárias e tipos específicos.
ORM — Object-Relational Mapper¶
- O ORM do Django permite interagir com o banco de dados usando Python ao invés de SQL.
- Facilita operações CRUD: criar, ler, atualizar, deletar registros.
Exemplo no shell interativo:
# Criar uma pergunta
q = Question(question_text="What's new?", pub_date=timezone.now())
q.save()
# Acessar dados
q.id
q.question_text
# Listar todas as perguntas
Question.objects.all()
- O ORM gera migrações com
makemigrationse aplica ao banco commigrate. - As migrações são versionáveis e mantêm o histórico de alterações.
Views e URLs (Rotas e Lógica do Backend)¶
Views¶
- Uma View é uma função (ou classe) Python que recebe um
requeste retorna umresponse. - O retorno pode ser: HTML, redirecionamento, JSON, imagem, erro 404, etc.
Exemplo do tutorial polls:
index: lista as últimas perguntas.detail: mostra os detalhes de uma pergunta específica.results: exibe resultados das votações.vote: processa um voto.
As views geralmente:
- Buscam dados dos Models.
- Processam formulários.
- Retornam o conteúdo via
HttpResponse.
URLs e Rotas (URLconf)¶
- O URLconf é um módulo
urls.pyque define uma listaurlpatterns. - Cada entrada mapeia um padrão de URL para uma View.
Exemplo (polls/urls.py):
urlpatterns = [
path("", views.index, name="index"), # /polls/
path("<int:question_id>/", views.detail, name="detail"), # /polls/5/
path("<int:question_id>/results/", views.results, name="results"), # /polls/5/results/
path("<int:question_id>/vote/", views.vote, name="vote"), # /polls/5/vote/
]
Templates e Renderização¶
Templates no Django¶
- Arquivos de texto (normalmente HTML) que misturam conteúdo estático com dados dinâmicos.
- Usam a linguagem de templates do Django (DTL).
Exemplo de recursos:
- Variáveis:
{{ variavel }} - Tags de controle:
{% if ... %},{% for ... %} - Filtros, comentários, etc.
Estrutura de Pastas¶
polls/
templates/
polls/
index.html
Exemplo (index.html):
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
Renderização na View¶
A view prepara o contexto (dicionário de dados) e renderiza:
return render(request, "polls/index.html", context)
Isso gera um HttpResponse com o HTML final.
Renderização como API¶
- HTML tradicional: usa-se o sistema de templates conforme descrito acima, adequado para páginas web.
- APIs JSON: normalmente não se usa templates. Em aplicações Django tradicionais, você retornaria algo como
JsonResponse(...). - Com Django REST Framework (DRF), usam-se Renderers (ex:
JSONRenderer) para gerar JSON.
Django Admin¶
O que é?¶
- Interface administrativa automática gerada pelo Django para permitir que administradores (como editores ou gerentes de conteúdo) criem, atualizem e apaguem dados dos seus modelos de forma rápida e sem necessidade de programar formulários ou views.
- Essa interface não é voltada para usuários públicos do site, mas sim para gente da equipe que precisa gerenciar o conteúdo.
Como ativar¶
- O app
django.contrib.adminjá está ativo por padrão. - Criar superusuário:
python manage.py createsuperuser - Acessar no navegador:
http://127.0.0.1:8000/admin/ - Registrar os Models em
admin.py:
from django.contrib import admin
from .models import Question
admin.site.register(Question)
Autenticação e Autorização¶
Autenticação (Authentication)¶
- Processo de verificar a identidade do usuário (ex: login com usuário e senha).
- O Django oferece:
- Modelos para usuários, grupos e permissões.
- Hashing seguro de senhas.
- Views prontas para login/logout.
- Backends de autenticação customizáveis.
Autorização (Authorization)¶
- Define o que um usuário autenticado pode fazer na aplicação.
- Baseada em permissões associadas a modelos (ex: adicionar, alterar, deletar).
- Permissões podem ser atribuídas a usuários ou grupos.
Exemplo:
if user.has_perm("polls.add_choice"):
# Usuário pode adicionar uma escolha
Criação de APIs com Django REST Framework (DRF)¶
Instalação¶
pip install djangorestframework
No settings.py, adicione em INSTALLED_APPS:¶
INSTALLED_APPS = [
...
"rest_framework",
]
Serializers¶
Transformam models em JSON (e vice-versa).
Exemplo Prático¶
from rest_framework import serializers
from .models import Question
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = ["id", "question_text", "pub_date"]
Views para API¶
DRF oferece ViewSets e APIView para lidar com requisições.
Exemplo usando ModelViewSet:¶
from rest_framework import viewsets
from .models import Question
from .serializers import QuestionSerializer
class QuestionViewSet(viewsets.ModelViewSet):
queryset = Question.objects.all()
serializer_class = QuestionSerializer
URLs com DRF Router¶
DRF tem routers que criam rotas automaticamente.
Exemplo simples¶
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import QuestionViewSet
router = DefaultRouter()
router.register(r"questions", QuestionViewSet)
urlpatterns = [
path("api/", include(router.urls)),
]
Testando a API¶
python manage.py runserver
Navegador¶
http://127.0.0.1:8000/api/questions/
Deploy de aplicações Django¶
Preparar o ambiente¶
pip install -r requirements.txt
Configurar banco de dados¶
Settings.py:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
Configurar variáveis do ambiente¶
Nunca deixar segredos (como SECRET_KEY) no código. Usar .env ou variáveis no servidor:
import os
SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY")
DEBUG = os.environ.get("DJANGO_DEBUG", "False") == "True"
Servidor WSGI/ASGI¶
O Django não deve rodar com runserver em produção. Usar:
Gunicorn (mais comum).
Uvicorn (se quiser suporte assíncrono).
gunicorn projeto.wsgi
Servidor Web¶
Usar Nginx ou Apache para:
Redirecionar tráfego HTTP/HTTPS.
Servir arquivos estáticos (CSS, JS, imagens).
Arquivo estáticos e mídia¶
bash python manage.py collectstatic
Isso junta todos os arquivos estáticos num só diretório, para o Nginx servir.
Deploy em serviços gerenciados¶
Se não quiser configurar tudo manualmente:
Heroku, Railway, Render, PythonAnywhere → todos suportam SQLite.
Docker também pode ser usado para empacotar o projeto.
Documentação criada por Matheus Saraiva (@apptrx) e Lucas Fujimoto (@Lucasft16)