Já realizei dezenas de testes. Usei o loop do método que cria o listener (código abaixo), para executar a chamada do save do Group (django.contrib.auth.models), mas a função do listener só é disparada quando ambas as chamadas estão no mesmo método. Mesmo se estiverem na mesma classe, mas em métodos diferentes, ou mesmo se estiverem no mesmo método, mas em chamadas a este método diferentes, não dispara.
from asgiref.sync import async_to_sync, sync_to_async
from django.dispatch import receiver
from django.contrib.auth.models import Group, Permission
import asyncio
import traceback
class ListenerDataBase():
async def create_listener(self, methodRESTSignal, ModelDataBase, async_callback):
'''
O parâmetro async_callback precisa ser uma função assíncrona com 3 parâmetros
'''
@receiver(methodRESTSignal, sender=ModelDataBase)
def trigger_async_callback(sender, instance, **kwargs):
print(f'trigguer_async_call disparada')
sync_callback = async_to_sync(async_callback)(sender, instance, **kwargs)
sync_callback()
#se a chamada a group.save() for feita, aqui, a função trigger_async_callback é executada
async def create_group(self, group_name):
def wrap_sync(self, group_name):
try:
group = Group(name=group_name)
group.save()
except Exception as e:
logger.error(f'Error inside wrap_sync -> {traceback.format_exc()}')
async_create_group = sync_to_async(wrap_sync) # (group_name)
await async_create_group(self, group_name)