- Django 6.0, que celebra 20 anos, é uma grande versão com melhorias significativas em áreas centrais como templates, tarefas em segundo plano, segurança e e-mail
- O recurso Template partials facilita a reutilização de código dentro dos templates e fortalece a integração com ferramentas como o htmx
- O novo framework de Tasks foi adicionado para executar tarefas em segundo plano fora do ciclo de requisição-resposta HTTP
- Content Security Policy (CSP) agora vem integrada por padrão, facilitando a defesa contra ataques de injeção de conteúdo como XSS
- Modernização da API de e-mail, melhorias no ORM e expansão das chaves primárias aumentam bastante a experiência do desenvolvedor e a escalabilidade
Visão geral do Django 6.0
- Django 6.0 é uma nova versão do framework web em Python, dando continuidade a 20 anos de evolução
- As principais mudanças se concentram em quatro áreas centrais: templates, tarefas em segundo plano, segurança e processamento de e-mail
- Vários contribuidores da comunidade de desenvolvedores participaram, e os principais avanços foram organizados com base nas notas oficiais de lançamento
Ferramenta django-upgrade
- Ao atualizar projetos existentes do Django 5.2 ou inferior, a ferramenta django-upgrade pode fazer transformações automáticas no código
- Ela inclui 5 fixers automáticos relacionados ao Django 6.0 e resolve alguns avisos automaticamente
Template partials
- Foi adicionado o recurso de definição de partes de template (
{% partialdef %}), permitindo reduzir duplicação e reutilizar código dentro dos templates
- É possível chamar várias vezes uma partial definida no mesmo template
- Com a opção
inline, é possível definir e renderizar ao mesmo tempo
- O recurso de renderização parcial permite renderizar apenas uma partial específica de forma independente
- No exemplo, o htmx é usado para atualizar periodicamente a parte
view_count
- Ao adicionar
#partial_name à URL, é possível renderizar apenas aquela parte específica
- Esse recurso foi integrado ao Django por meio de um projeto do Google Summer of Code e evoluiu a partir do pacote
django-template-partials
Framework de Tasks
- O Django agora inclui um novo framework de Tasks para execução de trabalhos em segundo plano
- Permite executar código fora do ciclo de requisição-resposta HTTP
- Pode ser usado para tarefas assíncronas como envio de e-mails, processamento de dados e geração de relatórios
- As tarefas são definidas com o decorator
@task e podem ser enfileiradas com Task.enqueue()
- Os backends fornecidos por padrão são
ImmediateBackend e DummyBackend, ambos voltados para desenvolvimento, e
com o DatabaseBackend do pacote django-tasks é possível executar com base em banco SQL
- O worker de tarefas é executado com o comando
db_worker, e o status pode ser acompanhado pelos logs
- Esse recurso nasceu de uma ideia iniciada no Wagtail e foi integrado ao Django após a proposta DEP 0014
Suporte a Content Security Policy (CSP)
- O Django 6.0 oferece suporte nativo ao padrão CSP, reforçando a proteção contra ataques de injeção de conteúdo como XSS
- Ative adicionando
ContentSecurityPolicyMiddleware em MIDDLEWARE
- A política pode ser configurada com
SECURE_CSP e SECURE_CSP_REPORT_ONLY
- A segurança baseada em nonce vem embutida, permitindo adicionar o atributo
nonce="{{ csp_nonce }}" às tags <script> e <style>
- Um nonce aleatório é gerado a cada requisição, permitindo a execução apenas de recursos confiáveis
- O CSP vinha sendo implementado pelo pacote
django-csp desde sua proposta em 2004, e agora passa a fazer parte oficial do framework
Atualização da API de e-mail
- A lógica de processamento de e-mail do Django foi migrada para a API moderna de e-mail do Python 3.6
- Internamente, passa a usar a classe
email.message.EmailMessage
- As interfaces existentes
send_mail() e EmailMessage continuam as mesmas
- A nova API oferece vantagens como menos bugs, mais segurança e melhor tratamento de anexos inline
- Com objetos
MIMEPart, é possível adicionar com facilidade anexos inline como imagens em corpo HTML
- Essa mudança foi proposta em 2024 e incorporada após 8 meses de desenvolvimento
Restrição de argumentos posicionais na API de e-mail
- Na API
django.core.mail, alguns parâmetros passaram a aceitar apenas argumentos nomeados
- Ao passar argumentos opcionais como
fail_silently por posição, um aviso é emitido
- A mudança busca melhorar legibilidade e manutenção
- É possível corrigir automaticamente com o fixer
mail_api_kwargs do django-upgrade
Expansão do auto import no Shell
- O recurso de importação automática de modelos do Django 5.2 foi ampliado,
incluindo settings, connection, models, functions, timezone automaticamente
- É possível verificar a lista de imports automáticos com
./manage.py shell -v 2
- Isso melhora a conveniência no desenvolvimento e reduz código repetitivo
Melhorias no ORM: atualização dinâmica de campos no save()
GeneratedField e campos baseados em expressões passam a ser atualizados automaticamente após save()
- Em bancos com suporte à cláusula
RETURNING (SQLite, PostgreSQL, Oracle), a atualização é refletida imediatamente
- No MySQL e MariaDB, a atualização automática acontece por carregamento tardio
- Isso melhora a eficiência ao permitir usar imediatamente os valores mais recentes sem consultas adicionais
Função de agregação universal StringAgg
- A função de agregação
StringAgg agora pode ser usada em todos os backends de banco de dados
- Ela retorna uma string com os valores de entrada unidos por um delimitador
- Antes era um recurso exclusivo do PostgreSQL, mas agora pode ser usada diretamente em
django.db.models
- O delimitador pode ser especificado com a expressão
Value()
BigAutoField como padrão
- O valor padrão de
DEFAULT_AUTO_FIELD foi alterado para BigAutoField
- Isso usa chaves primárias inteiras de 64 bits, ajudando a prevenir o esgotamento de Primary Keys
- Em novos projetos, isso se aplica automaticamente sem configuração extra
- A mudança simplifica a configuração introduzida no Django 3.2 e reduz boilerplate
Melhorias em templates
- A variável
forloop.length foi adicionada, permitindo consultar o tamanho total dentro do loop
- Pode ser usada no formato
{{ forloop.counter }}/{{ forloop.length }}
- Melhorias na tag de template
querystring
- Agora
? é adicionado automaticamente em mapeamentos vazios, garantindo consistência no comportamento dos links
- Também há suporte à mesclagem de múltiplos argumentos de mapeamento, facilitando a composição de parâmetros de query
Encerrando
- O Django 6.0 contou com a participação de 174 contribuidores e
inclui numerosas otimizações e correções de bugs
- Com a atualização, segurança, manutenção e experiência do desenvolvedor (DX) melhoram de forma geral
- Mais mudanças podem ser consultadas nas notas oficiais de lançamento
1 comentários
Comentários do Hacker News
Há alguns anos venho usando Django de forma intermitente no trabalho. No geral gosto, mas o ORM ainda parece difícil.
Só agora entendi que Django é um framework com opiniões fortes e que é preciso seguir o “jeito Django”.
O problema é que preciso lidar com múltiplos bancos de dados de várias áreas de negócio, então sofro para acomodar essas particularidades toda vez.
No fim, acabo desativando
managed, importando o esquema cominspectdbe depois removendo manualmente as tabelas que não quero expor na web.Para novas aplicações web, Django ainda é a melhor escolha
O Django não armazena o estado do esquema junto com o código, então toda vez que executa um comando no banco ele precisa inferir o estado atual.
Definir o estado do banco pelo código dos models tem limitações inerentes.
Eu prefiro bem mais a abordagem do Rails, de montar as migrações com comandos explícitos de banco e colocar os models por cima disso
A interface de Manager confunde no começo, mas a ferramenta de migrações é realmente excelente
Dá para ter ao mesmo tempo a flexibilidade de ajuste fino em SQL e a conveniência do Django.
Só não pode esquecer de criá-las dentro dos scripts de migração
Gosto muito de como o Django vai melhorando de forma constante a cada release.
A versão 6.0, em especial, parece interessante porque traz muitos recursos úteis.
Está errado quem diz que tecnologia confiável é chata. É assim mesmo que ela deve evoluir
Hoje moro perto do local de nascimento do Django.
E, além disso, comecei a procurar emprego ontem, então se alguém estiver buscando um desenvolvedor Django experiente, entre em contato (oldspiceap@gmail.com)
Código ou blog escrito pelo Adam sempre vale a leitura.
Estou curioso para ver como o framework de tasks vai evoluir daqui para frente.
Só achei um pouco triste o ótimo Django-Q2 ter sido mencionado junto com Celery
Tem muitos bugs, mas a base de usuários é tão grande que raramente você é o primeiro a encontrar um problema.
Já usei a combinação Celery + RabbitMQ para processar com estabilidade dezenas de milhões de mensagens por dia.
Ainda é uma solução que vale considerar primeiro
Em outras stacks também usamos Kafka, mas isso já é um caso de uso de outro nível
Uso Django há uns 5 ou 6 anos e, embora a vantagem de “batteries included” seja clara, no geral ele parece pesado
O recurso de template partial parece muito bom.
Um dos motivos de React ter ficado popular foi a reutilização de código, e parece que o Django está indo nessa direção
O exemplo está neste código
Eu uso principalmente Odoo, mas também já mexi um pouco com Django e Celery.
Como alguém que usa bastante o módulo de fila da OCA,
sempre me perguntei por que o Django não aproveita o recurso LISTEN/NOTIFY do Postgres.
Talvez seja só porque não conheço tão bem o ecossistema do Django
Template Partials e HTMX parecem a versão do Django de Rails View Components + Stimulus.
Também é bom ver o recurso de Tasks com suporte oficial
Uso Django desde a época do 1.x, antes de existirem tasks no framework.
É realmente surpreendente que só agora tenham adicionado uma funcionalidade de execução de tasks.
Não é uma crítica, só uma evolução interessante
Cada recurso só entra depois de estar bem validado, e o foco está em LTS e estabilidade de API.
Por isso, quando sai uma nova versão, quase nunca é preciso reescrever a aplicação inteira
Na época ele era simples, mas durante bastante tempo não havia necessidade de usar raw SQL
A discussão adicional continua nesta thread
Uso Django com HTMX e achava templates em nível de componente tão inconvenientes que acabei criando minha própria biblioteca de componentes em Python, Compone.
Ela pode ser usada não só no Django, mas em qualquer framework web em Python, e oferece uma experiência de desenvolvimento muito mais agradável