Signals (Eventos)

Sistema de sinais para executar callbacks quando eventos ocorrem.

Sinais Padrão

from velox.signals import (
    request_started,
    request_finished,
    request_error,
    template_rendered,
    database_query,
    user_logged_in,
    user_logged_out,
)

Conectar Callback

def meu_callback(sender, **kwargs):
    print(f'Evento em {sender}')

# Conectar ao sinal
request_started.connect(meu_callback)

Decorador @receiver

Forma mais limpa de conectar:

from velox.signals import receiver, request_finished

@receiver(request_finished)
def after_request(sender, request, **kwargs):
    print(f'Requisição {request.path} finalizada')

Desconectar

# Por função
request_finished.disconnect(meu_callback)

# Por dispatch_uid
request_finished.disconnect(dispatch_uid='meu_uid')

Emitir Sinal

from velox.signals import emit

# Emitir sinal padrão
emit('request_finished', sender=app, request=request)

# Criar sinal customizado primeiro
from velox.signals import create_signal

meu_sinal = create_signal('meu_evento')
emit('meu_evento', sender=self, data='valor')

Criar Sinais Customizados

from velox.signals import Signal

# Criar sinal
post_saved = Signal(['post', 'created'])

# Conectar
@receiver(post_saved)
def on_post_saved(sender, post, created, **kwargs):
    if created:
        print(f'Novo post: {post.title}')
    else:
        print(f'Post atualizado: {post.title}')

# Emitir
post_saved.send(sender=model, post=post_obj, created=True)

Emitir com Robustez

send_robust() captura exceções nos receivers:

responses = post_saved.send_robust(sender=self, post=post)

for func, response in responses:
    if isinstance(response, Exception):
        print(f'Erro em {func}: {response}')
    else:
        print(f'Sucesso: {response}')

Exemplo Completo

from velox.signals import receiver, request_started, request_finished

@receiver(request_started)
def log_request(sender, request, **kwargs):
    print(f'Iniciando: {request.method} {request.path}')

@receiver(request_finished)
def after_request(sender, request, **kwargs):
    print(f'Finalizado: {request.method} {request.path}')