Executando verificação de segurança...
8

Signals Django - Uma mão na roda

Um Breve Discurso

Olá a todos,

Hoje vim compartilhar algo que aprendi e que tem sido muito útil em vários projetos.

Se você ainda não conhece, gostaria de falar um pouco sobre os signals no Django.

Os signals são uma ferramenta que permite que diferentes partes de um sistema se comuniquem e respondam a eventos específicos de forma desacoplada.

Em resumo, eles funcionam como um mecanismo para "ouvir" e reagir a ações que ocorrem dentro do seu projeto. Isso é especialmente útil para executar ações adicionais, como validações, atualizações e processamento de dados, sem precisar colocar um codigo em cada local onde o evento acontece.

Aqui estão alguns exemplos de signals que podem ser extremamente úteis:

  • pre_save: Executado antes de um objeto ser salvo no banco de dados.
  • post_save: Executado após um objeto ter sido salvo no banco de dados.
  • pre_delete: Executado antes de um objeto ser excluído do banco de dados.
  • post_delete: Executado após um objeto ter sido excluído do banco de dados.
  • pre_init e post_init: Executados antes e após a criação de uma nova instância de um objeto, respectivamente.
  • m2m_changed: Executado quando há alterações em uma relação ManyToMany.
  • pre_migrate e post_migrate: Executados antes e após uma migração de banco de dados.
  • request_started e request_finished: Executados quando uma solicitação HTTP é iniciada e concluída.

Para ilustrar, vou mostrar um exemplo prático usando o signal post_save. Suponha que você queira enviar um email de boas-vindas sempre que um novo usuário se registrar:

# models.py
from django.db import models
from django.db.models.signals import post_save
from django.core.mail import send_mail
from django.dispatch import receiver

class Usuario(models.Model):
    nome = models.CharField(max_length=100)
    email = models.EmailField()

@receiver(post_save, sender=Usuario)
def enviar_email_boas_vindas(sender, instance, created, **kwargs):
    if created:
        send_mail(
            'Bem-vindo ao nosso site!',
            f'Olá {instance.nome}, obrigado por se registrar.',
            '[email protected]',
            [instance.email],
            fail_silently=False,
        )

no final fica uma duvida na linguagem que você usa existe algo parecido?

Carregando publicação patrocinada...
3

Olá Erik, realmente os signals são muito bons, gostaria de adicionar algumas observações sobre:
Na própria documentação: https://docs.djangoproject.com/en/5.0/topics/signals/, existe uma observação para termos cuidado que realmente faz o código bem dificil de entender, eu pessoalmente uso apenas como ultimo recurso, e quando utilizo tento deixar bem explicito que existe um signal para o save. Outro ponto é quando combinados com tasks, não é garantido mesmo no caso do post_save que os dados já estarão persistidos no banco de dados, para esse caso é usado transaction.on_commit