У меня есть собственный сигнал, и есть 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](https://i.stack.imgur.com/sOFhn.png)
Вы можете ясно видеть, что метод вызывается из вида, и этот сигнал не был отключен (возвращено False
).
Между тем, вероятно, была еще пара сообщений, поскольку webhook отправлял несколько запросов. Поэтому я переключаюсь на Thread-8
в отладчике. Там я вижу, что сигнал был отключен правильно.
![enter image description here](https://i.stack.imgur.com/lqirZ.png)
Трассировка такая же, так почему однажды True
, а в другой False
? Эта проблема вызывает циклическое переключение через Webhook -> Client -> Webhook -> Client ....
Я заметил, что каждый раз, когда я вызываю этот метод через shell_plus
, сигнал корректно отключается.
У вас есть идеи?