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
epost_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
epost_migrate
: Executados antes e após uma migração de banco de dados.request_started
erequest_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?