2015-04-23 32 views
2

UPDATE 下面的代碼非常好。我剛剛找到了我的問題的答案:我用另一個在該模塊上使用相同名稱的覆蓋處理程序,所以weakref被刪除...其他人可以使用下面的代碼根據Django文檔正確地註冊信號。爲什麼Django信號被移除而weak = False?

在我的Django 1.8,Python 2.7.9中,我定義了一個永遠不會被調用的信號。它看起來像是因爲某些原因被垃圾收集。處理程序是在模塊級別定義的,而不是在函數內部,所以我期望只要程序正在運行,它就會停留在那裏。在連接信號時使用weak = False可以解決問題,但我想知道這種行爲的具體情況。

這大約是我使用的代碼:

# myapp/apps.py 

from django.apps import AppConfig 

class MyAppConfig(AppConfig): 

    name = 'myapp' 

    def ready(self): 
     import myapp.signals 
# myapp/__init__.py 

default_app_config = 'myapp.apps.MyAppConfig' 
# myapp/signals.py 

from django.db.models.signals import post_delete 
from django.dispatch import receiver 
from otherapp.models import Model 

@receiver(post_delete, sender=Model) # weak=True 
def post_delete_hype_callback(sender, **kwargs): 
    # Do stuff here 
    pass 

型號採用post_delete信號不會被調用。我甚至無法在連接的信號列表中看到它。在接收器裝飾器上使用weak = False解決了這個問題。

從我的角度來看,接收器裝飾器返回正在裝飾的實際功能,所以它應該保持在模塊級別,並且永遠不會被垃圾收集。我還檢查了當應用程序調用準備好時(通過使用import myapp.signals)處理程序連接到信號。

我能想到的唯一合理的解釋是,一旦MyAppConfig的ready()方法完成signals.py模塊獲取垃圾回收,因爲在任何地方都沒有其他引用,但這不是我所期望的行爲。

這似乎是根據Django文檔連接信號的推薦方式,但似乎沒有爲我工作。

任何人都可以闡明這種行爲?

回答

5

我剛剛找到了我的問題的答案:代碼是完全正確的,但我用一個不同的處理程序覆蓋函數,我使用相同的名稱在它下面定義了...... -.- u那就是爲什麼那個處理程序正在被使用的時候被垃圾收集。我將在這裏留下問題,以便其他人可以看到如何根據Django文檔正確連接信號。

相關問題