2010-01-19 48 views
8

我需要一個地方來運行應用程序特定的初始化代碼(如連接到信號)。 當我將代碼放入應用程序的__init__.py模塊時,我最終得到了模型的循環導入。Django應用程序初始化代碼(如連接到信號)

有沒有辦法在安裝框架和執行任何請求之前觸發函數?

我使用的是舊版本的django 96.6,但我也對當前版本的解決方案感興趣。

關於其他問題的重複: 這裏的問題在評論由美國洛特建議重複的區別:

評論當前的解決方案: 我不能使用的網址,因爲大多數我的應用程序沒有暴露任何URL。他們只是聽信號並在數據庫中存儲附加信息。

+0

Duplicate:http:// stackoverflow。com/questions/1797046/correct-place-to-put-extra-startup-code-in-django,Duplicate:http://stackoverflow.com/questions/1986060/where-should-i-place-the-one- time-operation-in-the-django-framework –

+0

@ S.Lott它不是重複的。我需要一個在django框架初始化後立即爲python解釋器的每個實例運行的代碼。我將在 –

回答

5

建議將信號放入應用程序的models.py中。

試試models.py或urls.py,讓我們知道你是否有幸運。

+0

這個問題中詳細闡述我不能將它放入模型中,因爲我需要在它自己的模塊中使用該函數,並且我需要在該模塊中使用我的模型。 –

+0

你的信號函數定義可以在一個單獨的文件中(我使用signals.py - creative,我知道),但是在我的models.py中,我在底部添加了像post_save.connect(profile_updater,sender = MyProfile)與適當的進口。 – ashchristopher

+1

@ashchristopher但如果你的signals.py使用模型,你最終會得到循環引用。我不想在非常信號處理程序中導入模型。 –

5

這樣的東西最好的地方...任何地方,只需將它導入到你的urls.py文件(由於顯而易見的原因,網址在任何請求之前加載)。

+0

我希望有更明確的內容:( –

+0

)我的應用根本沒有網址(他們只是聽信號並在數據庫中存儲附加信息) –

+0

如果您運行管理命令,信號將不會連接 –

2

如果你不提供網址,那麼你真的需要把它放在models.py,這就是它的方式。

現在,解決你的問題:你想在自己的模塊中定義它,很好,那樣做。爲避免循環導入,請使用django.db.models.get_model爲您動態返回模型。您可以爲信號模塊提供初始化功能,以導入相關模型並連接相關信號。然後在models.py的末尾調用該函數,只會在您的模型初始化後運行一次。

仍然有可能無法正常工作(如果模型尚未準備好,請將其設置),但請嘗試並告訴我們。

0

對於我來說,下面的工作:

INIT的.py:

from . import models 
from . import signals 

signals.py從車型的進口,而不是相反。 signals.py包含導入時立即運行並在django服務器啓動時運行的模塊代碼。