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.