DJANGO Signal.disconnect - противоречивые результаты (действительно странно) - PullRequest
0 голосов
/ 19 марта 2019

У меня есть собственный сигнал, и есть classmethod, который обновляет некоторые объекты, где мне нужно отключить этот сигнал, чтобы изменения не синхронизировались с pipedrive, потому что этот метод используется только представлением для веб-хуков.

@classmethod
def backsync_all_stages(cls):
    s = sync_object.disconnect(sync_object_receiver)
    stages_json = PipeDriveWrapper.get_all_stages()
    if stages_json.get('success'):

И есть представление, которое вызывает этот метод, если запрос POST:

def post(self,request,*args,**kwargs):
    data = json.loads(request.body)
    model_alias = data['meta']['object']
    Model = PipedriveSync.WEBHOOK_MODEL_MAP[model_alias]
    if Model == LeadStage:
        PipedriveSync.backsync_all_stages()
    ...

Проблема в том, что иногда он отключает сигнал, а иногда нет. Когда я вызываю PipedriveSync.backsync_all_stages() внутри shell_plus, он работает правильно.

Но согласно представлению - в отладчике я вижу, что в обоих случаях метод вызывается из одного представления. Я абсолютно не понимаю, что происходит.

Поэтому я вызываю webhook и устанавливаю точку останова под командой disconnect, чтобы вы могли видеть, что она возвращает True и traceback.

Так что вызывать webhook и ждать ...

enter image description here

Вы можете ясно видеть, что метод вызывается из вида, и этот сигнал не был отключен (возвращено False).

Между тем, вероятно, была еще пара сообщений, поскольку webhook отправлял несколько запросов. Поэтому я переключаюсь на Thread-8 в отладчике. Там я вижу, что сигнал был отключен правильно.

enter image description here

Трассировка такая же, так почему однажды True, а в другой False? Эта проблема вызывает циклическое переключение через Webhook -> Client -> Webhook -> Client ....

Я заметил, что каждый раз, когда я вызываю этот метод через shell_plus, сигнал корректно отключается.

У вас есть идеи?

...