Lançamento do Django 6
(docs.djangoproject.com)- A versão 6.0 do framework web Django foi lançada com suporte a Python 3.12 ou superior, e trouxe reforços significativos de segurança, templates e recursos assíncronos
- O Content Security Policy (CSP) agora é incorporado por padrão para configurar políticas de defesa contra ataques de injeção de conteúdo, como XSS
- O recurso Template Partials melhora a modularização do código ao permitir definir partes reutilizáveis dentro de templates
- O framework de Background Tasks foi adicionado para suportar a execução de tarefas assíncronas fora do ciclo de requisição-resposta
- A adoção da API de e-mail mais moderna do Python, o fim do suporte ao MariaDB 10.5 e a alteração do valor padrão de
DEFAULT_AUTO_FIELDrepresentam ajustes de compatibilidade e modernização
Compatibilidade com Python
- O Django 6.0 oferece suporte a Python 3.12, 3.13 e 3.14, e somente as versões mais recentes de cada série contam com suporte oficial
- O Django 5.2.x é a última versão com suporte a Python 3.10 e 3.11
- Após o Django 6.0, é recomendável que aplicativos de terceiros deixem de dar suporte a versões anteriores ao Django 5.2
Principais novidades
Suporte ao Content Security Policy (CSP)
- O Django passou a incluir nativamente o padrão CSP, fortalecendo a proteção contra ataques de injeção de conteúdo, como XSS
- É possível definir políticas por meio de
ContentSecurityPolicyMiddleware, do processador de contextocsp()e da configuraçãoSECURE_CSP - Configuração baseada em dicionário Python para compor políticas de forma clara e segura
- É possível definir políticas por meio de
- O modo de monitoramento pode ser ativado com
SECURE_CSP_REPORT_ONLY - Decorador para sobrescrever ou desativar a política por view disponível
Template Partials
- Adição das tags
partialdefepartialpara definir e reutilizar fragmentos de template - A sintaxe
template_name#partial_namepermite referência direta emget_template(),render(),{% include %}e similares - Incluído guia de migração para usuários do pacote de terceiros
django-template-partials
Framework de Background Tasks
- Adição ao Django de um framework embutido para execução de tarefas assíncronas
- Permite enviar e-mails, processar dados etc. fora do ciclo de requisição-resposta HTTP
- Definição de tarefas com o decorador
@taske enfileiramento viaenqueue()
- O backend é definido com a configuração
TASKS, e inclui dois backends padrão para desenvolvimento e testes - O Django se responsabiliza pela criação e enfileiramento das tarefas, enquanto a execução é feita por processos worker externos
Adoção da API moderna de e-mail do Python
- A lógica de e-mail do Django migrou para a API moderna do Python a partir do 3.6 (
email.message.EmailMessage) - As classes
SafeMIMETexteSafeMIMEMultipartdeixaram de ser utilizadas - O tipo de retorno de
EmailMessage.message()foi alterado para uma instância deEmailMessagedo Python
Melhorias detalhadas
Admin
- Aplicado o conjunto de ícones Font Awesome Free 6.7.2
- Personalização do formulário de alteração de senha do admin via propriedade
AdminSite.password_change_form - Aplicação de ícones e estilos CSS distintos para
messages.DEBUGemessages.INFO
Auth
- O número de iterações de hash do PBKDF2 aumentou de 1.000.000 para 1.200.000
GIS
- É possível verificar a presença da dimensão M com o atributo
GEOSGeometry.hasm - Suporte a rotação por ângulo usando a função
Rotate - O atributo
BaseGeometryWidget.base_layerpermite customizar o provedor de tiles do mapa - Recursos como
coveredby,isvalid,GeoHasheIsValidpassaram a ser suportados no MariaDB 12.0.1+ - JavaScript inline removido na renderização de widgets; ao personalizar, pode ser necessário ajustar o template
PostgreSQL
- Adicionada a expressão Lexeme para reforçar o controle de pesquisa textual completa
- Parâmetro
hintsadicionado a operações relacionadas a extensões comoCreateExtension - Adicionadas verificações de sistema para campos, índices e constraints relacionados ao
django.contrib.postgres
Staticfiles
ManifestStaticFilesStorageagora garante consistência de ordenação de caminhos, reduzindo diffs desnecessários- O comando
collectstaticpassa a exibir apenas um resumo por padrão; detalhes aparecem com--verbosity 2ou superior
Outros
- Adicionado suporte ao idioma Haitian Creole
- Os comandos
startprojectestartapppassam a criar automaticamente diretórios inexistentes - O comando
shellimporta automaticamente utilitários padrão, comodjango.conf.settings - Suporte à serialização de
zoneinfo.ZoneInfoem migrações - Novas funções de agregação adicionadas, como
StringAggeAnyValue - Suporte a paginação assíncrona com
AsyncPaginatoreAsyncPage - Suporte a múltiplos cabeçalhos de cookie em ambiente HTTP/2 no ASGI
- Adição da variável
forloop.lengthno template e melhora no tagquerystring DiscoverRunnersuporta testes paralelos usando o modoforkserver
Mudanças sem compatibilidade
API de backend de banco de dados
BaseDatabaseSchemaEditore o backend PostgreSQL descontinuaram o uso deCASCADEna remoção de colunas- Mudança de nomes de método, como de
return_insert_columns()parareturning_columns() - Quando houver suporte a
UPDATE … RETURNING, é possível definirDatabaseFeatures.can_return_rows_from_update=True
Deprecations
- Fim do suporte ao MariaDB 10.5 (requer 10.6 ou superior)
- Fim do suporte para Python abaixo de 3.12
- Versões mínimas principais:
aiosmtpd 1.4.5,bcrypt 4.1.1,Pillow 10.1.0,psycopg 3.1.12, entre outras
- Versões mínimas principais:
- Removidos os atributos
mixed_subtype,alternative_subtypeeencoding - Alterações internas exigem validação de subclasses customizadas de
EmailMessage
Alteração do valor padrão de DEFAULT_AUTO_FIELD
- O padrão mudou de
AutoFieldparaBigAutoField - Projetos que ignoraram o aviso do Django 3.2 (
models.W042) precisam adicionar uma configuração
Expressões ORM
- O parâmetro de retorno do método
as_sql()deve ser uma tupla
Outros
- Sempre adicionar newline na serialização JSON
- Versão mínima do
asgireffoi aumentada para 3.9.1
Recursos planejados para descontinuação
API django.core.mail
- Em
get_connection(),send_mail()e similares, argumentos opcionais devem ser passados apenas por nome de parâmetro - Ao instanciar
EmailMessageeEmailMultiAlternatives, apenas os quatro primeiros argumentos podem ser posicionais; os demais devem ser nomeados
Outros
- Removido
BaseDatabaseCreation.create_test_db(serialize), usarserialize_db_to_string() - Descontinuados
StringAggeOrderableAggMixinexclusivos do PostgreSQL - O protocolo padrão de
urlizeeurlizetruncmudará para HTTPS no Django 7.0 - As configurações
ADMINSeMANAGERSdevem ser informadas como lista de strings de e-mail, e não mais tuplas(nome, endereço) - Descontinuadas classes relacionadas a e-mail, como
SafeMIMEText,SafeMIMEMultiparteBadHeaderError
Funções removidas
- Removido o suporte a argumentos posicionais em
BaseConstraint - Removidos
DjangoDivFormRenderereJinja2DivFormRenderer - Removido o suporte ao driver de banco de dados
cx_Oracle - O esquema padrão de
forms.URLFieldfoi alterado de"http"para"https" - Removido o suporte a argumentos posicionais em
Model.save()eModel.asave() - Removidos
ModelAdmin.log_deletion()eLogEntryManager.log_action() - Removido o módulo
django.utils.itercompat - Removidos os métodos
GeoIP2.coords()eGeoIP2.open() - Removidos
ForeignObject.get_joining_columns()e métodos relacionados
O Django 6.0 aumentou a robustez e a escalabilidade do framework com melhorias de segurança, tarefas assíncronas e adoção de uma API moderna de e-mail, além de consolidar a migração para ambientes com Python 3.12+.
1 comentários
Opinião no Hacker News
Em uma organização onde trabalhei no passado, havia uma codebase “moderna” em NodeJS+React e um app legado em Django baseado em Python 2.7 com quase 15 anos
No começo, achei que o código antigo seria doloroso de manter, mas aconteceu justamente o contrário
O app em Django era um prazer de mexer, e o processo de organizá-lo era realmente divertido. Vou até sentir falta quando ele for substituído por uma nova reescrita em Go/React
Parabéns à equipe do Django
Há muito tempo mantenho um app inicial com Django + Celery + Postgres + Redis + esbuild + Tailwind baseado em Docker Compose e recentemente o atualizei para o Django 6.0
Dá para ver no repositório no GitHub
Ainda não incluí a configuração de CSP por padrão, mas pretendo adicionar depois de revisar melhor
A filosofia “batteries included” do Django combina perfeitamente com geração de código por IA
Painel administrativo, login, redefinição de senha e outros recursos básicos já vêm muito bem resolvidos, então a IA consegue criar um site completo mesmo com uma codebase pequena
Como o código é pequeno e claro, também fica fácil para a IA melhorá-lo iterativamente
Em vez de componentes gigantes, há modelos e templates claros, então também é mais fácil revisar código gerado por IA
Além disso, o Django admin existe como uma ground truth independente, então mesmo que o frontend quebre ainda dá para lidar com os dados
Só acho uma pena que o ecossistema Python não tenha adotado o modelo gevent. Se tivesse adotado, a transição para o assíncrono teria sido muito mais suave
É muito mais integrado do que frameworks acoplados de forma frouxa como Flask ou FastAPI
No fim, essa diferença reduz uma enorme quantidade de pequenos incômodos (papercuts)
Reescrevi um app antigo em .NET, e o Rails fez a conversão quase perfeitamente, enquanto o Django teve dificuldade
O recurso de template partials deste lançamento parece bem interessante
Mas a situação das type annotations continua desconfortável
O django-stubs exige um plugin do mypy, o django-types é um fork para pyright mas não fica bem sincronizado
E o pylance usa ainda outro fork próprio
Espero que na próxima versão pelo menos tipos básicos como HttpRequest, HttpResponse, View e Model sejam incluídos oficialmente
Graças ao Django, desenvolver para web foi realmente divertido
Mesmo quando migro para outros frameworks, sempre acabo voltando para o Django. Foi uma escolha sem arrependimentos
Mesmo testando outros frameworks, acabo voltando por causa da praticidade do Rails
Só é uma pena que o Rails não tenha uma Admin UI nativa
Se você quer um full stack completo, é melhor olhar para Laravel ou Rails
Trabalho com web desde a era do PHP, e o Django sempre me pareceu apenas ok
Django foi meu primeiro grande projeto freelance e ainda hoje me passa uma sensação de familiaridade
Fiz várias tentativas experimentais com ele, e sempre funcionou bem. Sou grato ao Django
Há quase 15 anos uso Django quase exclusivamente
Tentei vários outros frameworks, mas nenhum encaixou tão bem nas mãos quanto o Django
Nesta release foi adicionado o task framework, mas é uma pena que ele não venha com backend e worker incluídos
Preferia que entrasse numa forma completa na próxima versão
A configuração batteries included do Django o torna adequado para qualquer projeto, independentemente do tamanho
Meus aplausos à equipe e aos contribuidores
Fico curioso sobre como entramos na era das SPAs. Será que foi só para eliminar spinners de carregamento, ou havia uma razão mais profunda?
Quando web, iOS e Android passaram a compartilhar um mesmo backend, o padrão SPA se espalhou naturalmente
Eu ainda faço SPAs, mas um dia gostaria de tocar um projeto grande com Django + htmx
Era atraente ter algo funcionando como app sem recarregar a página, mas na prática muitas vezes ainda era preciso dar um hard refresh
Mesmo assim, acho elegante a estrutura que separa dados e apresentação
Então surgiram várias tentativas de transformar documentos em apps com JS
No fim, frontend e backend foram separados, e surgiram contratos de API e processos de validação
Depois apareceu um movimento para reunir tudo de novo com server components, e é exatamente nesse ponto que estamos agora
Como referência, um exemplo de webform no estilo antigo pode ser visto neste link
Por isso passei a preferir um processo de build baseado em TypeScript
Toda vez que uso Django, sinto simplesmente alegria. É só isso.