Django Сигнал застрял в петле - PullRequest
3 голосов
/ 04 августа 2020

У меня есть 3 сигнальные функции, и одна застревает в al oop при вызове. Он вызывается, когда объект внутри класса модели обновляется на странице Django Admin ...

# models.py
class Item(models.Model):
    ...
    foo = models.BooleanField(
        default=False,
        editable=True,
        blank=True,
        help_text='Blah Blah...'    
    )
# signals.py
@receiver(pre_save, sender=Item)
def foobar(sender, instance, **kwargs):
    try:
        pass
    except:
        pass

Я буквально помещаю pass в каждый try и except с вызовом журнала, чтобы увидеть, повторяется ли он, даже без кода в них, и это так. Постоянно без конца. Это также происходит с использованием оператора if / else вместо try / except.

Как, черт возьми, я могу остановить застревание сигнала в al oop? Предполагается, что каждый раз отправляется электронное письмо, но теперь, когда объект обновляется, пользователь получает бесконечное количество писем, пока я не перезагружусь Django.

Я действительно в недоумении ...

BTW , этого не происходит на моем тестовом сервере, только на моем рабочем / промежуточном сервере.

EDIT :

Если вы просматриваете это в будущем, то вот как я отлаживал свою проблему.

Ищите все, что работает / поражает ваш сервер и потенциально может вызвать запуск signal. Для меня это был конкретный объект c, который был установлен как sender для запуска сигнала, и каждый раз, когда я использовал веб-перехватчик, запускалась функция, которая изменяла специфику c sender object.

1 Ответ

0 голосов
/ 05 августа 2020

Так что я не решаюсь публиковать это как «Ответ», поскольку это потенциально только дает повод для моей собственной проблемы, но я понял, что происходит ...

Я недавно подключил Webhook к моему приложению Django, которое постоянно обращается к нему и обновляет информацию ... Я исправил свою функцию webhook, чтобы воздействовать только на объект модели (выше это Class Item), чтобы он снижает количество запусков сигналов.

Однако это буквальное исправление для сигнала, выполняющегося до завершения:

# signals.py
...

obj = sender.objects.get(pk=instance.pk)

# We are checking if the instance value is different than what the object value
# is. Remember, this is PRE_SAVE, so the object should be different than the
# instance
if instance.variable and not obj.variable:
    ...

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...