Django 2.2 LTS
Saiu a última versão LTS do Django. O último release LTS foi a 1.11 que também foi a última versão do Django com suporte para legacy Python (2.x).
A versão 1.11 tem suporte até Abril de 2020 mas o Python 2.7 atinge EoL (end of life) no final deste ano. Como todas as versões LTS a 2.2 terá suporte por 3 anos. Com esse release a versão 2.1 atingiu o final do suporte oficial e receberá atualizações de segurança apenas até o final do ano.
Destaques
Como sempre você pode ver a lista completa de novidades no Release Note mas aqui vão alguns destaques:
Acesso simplificado para os cabeçalhos HTTP
Agora o objeto HttpRequest tem uma nova propriedade headers
para acesso aos cabeçalhos. Antigamente você tinha acesso através de um dicionário em HttpRequest.META
mas este acesso era um pouco inconveniente:
>>> request.`META
{'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...}
>>> 'User-Agent' in request.META
False
>>> 'user-agent' in request.META
False
Como pode ver no exemplo acima você era obrigado a saber a convenção maluca do Django para os cabeçalhos — prefixar tudo com `HTTP_`, converter para maiúsculas, trocar -
por _
e etc. Agora esse acesso ficou muito mais conveniente:
>>> request.headers
{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...}
>>> 'User-Agent' in request.headers
True
>>> 'user-agent' in request.headers
True
>>> request.headers['User-Agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers['user-agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers.get('User-Agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers.get('user-agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
Database-level Constraints
Agora existem novos objetos para criar restrições em nível de banco de dados. Por exemplo, se você quiser criar uma constraint para permitir apenas usuários maiores e vacinados:
maior_e_vacinado = CheckConstraint(
check=Q(idade__gte=18, vacinado=True),
name='maior_e_vacinado_constraint',
)class Usuario(models.Model):
...
class Meta:
constraints = (maior_e_vacinado,)
Isso é muito mais poderoso do que simplesmente fazer override
do método clean
ou save
no Model e extremamente útil se o projeto compartilha acesso ao banco de dados com outros sistemas. Da mesma forma UniqueConstraint é ao mesmo tempo mais poderoso e simples de usar que Meta.unique_together
— devagar o ORM do Django vai ficando mas próximo do SQL.
Watchman no webserver de desenvolvimento
Se você já teve que rodar o servidor de desenvolvimento em um projeto realmente grande então você sabe que não é qualquer máquina que aguenta… Agora é possível usar Watchman que tem uma performance superior ao anteriormente usado pyinotify
— especialmente para grandes projetos.
Você precisa instalar tanto o pywatchman quanto o serviço Watchman no Linux/Mac. Ainda assim, se você tem aquele node_modules
gigantesco sentado na sua árvore de diretórios é aconselhável configurar o Watchman pra ignorar esta pasta.
Conclusão
Se você estava precisando de incentivo para fazer upgrade para uma versão mais nova do Python/Django, essa parece ser uma boa oportunidade. Ainda tem mais 1 ano de suporte para a versão 1.1 mas upgrade é uma coisa chata e 1 ano passa rápido então não deixa pra última hora.