Django Signals

Signals: O Que São e Como Usá-los

O Django é um framework web para desenvolvimento rápido e fácil em Python que tem uma característica muito útil chamada Signals. Signals são eventos que o Django envia quando certas ações ocorrem, como criar um registro em um banco de dados ou excluir um objeto. Usando Signals, você pode executar ações personalizadas em resposta a esses eventos.

Neste post, vamos nos aprofundar em Signals do Django, explorando como eles funcionam e como você pode usá-los em seus próprios projetos.

Como Signals Funcionam

Para entender o que são Signals, primeiro é preciso entender como o Django gerencia os eventos internamente. O framework Django usa um dispatcher de sinal central que gerencia todos os eventos e as funções associadas a eles. Quando uma ação ocorre, o dispatcher de sinal procura funções registradas para executar em resposta ao evento.

Para se registrar com um evento, você define uma função que é chamada sempre que o evento ocorre. Esta função é chamada de receiver. Para registrar uma função como um receiver, você usa o decorador receiver do Django e o argumento do decorador é o evento que você deseja se registrar:

from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(post_save, sender=MyModel)
def do_something(sender, **kwargs):
    # faça algo aqui

 

No exemplo acima, usamos o receiver para se registrar para o evento post_save - que é enviado após um objeto ser salvo no banco de dados - e o modelo MyModel é o remetente. A função do_something será chamada toda vez que um objeto MyModel é salvo.

Um receiver deve sempre ter um argumento sender e os argumentos para o evento - como **kwargs - que levam informações adicionais. Além disso, um receiver deve estar localizado em um arquivo que seja importado pelo Django durante a inicialização do aplicativo, o que geralmente significa colocar o receiver em um arquivo de sinais. 

 

Usando Signals para Solucionar Problemas

Agora que você sabe como se registrar para eventos com Signals, vamos dar uma olhada em como podemos usá-los para resolver problemas comuns:

 

Limpar cache após salvar um objeto

from django.core.cache import cache
from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(post_save, sender=MyModel)
def clear_cache(sender, **kwargs):     
	cache.clear()
 
O exemplo acima mostra como usar Signals para limpar o cache após salvar um objeto do modelo MyModel. Cada vez que um objeto é atualizado, o cache será limpo para que as próximas solicitações possam obter os dados atualizados.
 

Enviar um email após um objeto ser criado

from django.core.mail import send_mail
from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(post_save, sender=MyModel)
def send_email(sender, **kwargs): 
    if kwargs['created']:         
        send_mail('Novo objeto criado', 
                  'Um novo objeto foi criado na base de dados',
                  'admin@example.com',
                  ['user@example.com'])

 

Este exemplo mostra como usar Signals para enviar um email sempre que um novo objeto for criado no modelo MyModel. Se o objeto foi criado pela primeira vez - verificado pelo kwargs['created'] - um e-mail será enviado para notificar o administrador sobre o novo objeto.

 

Excluir um objeto relacionado após a exclusão do objeto principal

from django.db.models.signals import post_delete
from django.dispatch import receiver
from myapp.models import MyModel, RelatedModel

@receiver(post_delete, sender=MyModel)
def delete_related(sender, **kwargs):
	related_objects = RelatedModel.objects.filter(
     	mymodel_id=kwargs['instance'].id)
	related_objects.delete()

 

O exemplo acima mostra como usar Signals para excluir objetos relacionados do modelo RelatedModel quando um objeto do modelo principal MyModel é excluído. Quando um objeto é excluído, o receiver procura por qualquer objeto relacionado e excluirá os objetos que estiverem relacionados ao objeto principal com base no mymodel_id.

 

Veja esse video para mais detalhes

 

Conclusão

Neste post, aprendemos sobre os Signals do Django e como eles podem ser usados para responder automaticamente a eventos em nosso aplicativo. Esperamos que você possa aplicar essa técnica em seus próprios projetos para resolver problemas comuns e automatizar tarefas. Se você tiver mais dúvidas sobre o uso de Django Signals, confira a documentação oficial do Django.

Comentários

Total de Comentários: 0