2012-12-11 22 views
5

使用中間件,我可以在每個HTTP請求的開始和結束處執行代碼。在任何django管理命令之前運行代碼

隨着芹菜任務,我可以通過使用task_preruntask_postrun信號完成相同的操作。

那麼django管理命令呢?是否有可能在每個django管理命令的開頭(可能是結尾)運行代碼?此類代碼還必須知道哪個django管理命令即將運行(或已完成運行)。有一張關於signal on application startup的票可能會或可能不會做我想要的,但它還沒有準備好。

回答

2

正如你正確地陳述有Django中沒有具體的地方,你可以把在每次啓動時執行的代碼...

有一些地方,你可能能夠「濫用」這一目的,例如。應該在啓動時運行urls.pymodels.py中的代碼...(例如,管理員將此情況用於其admin.autodiscover()urls.py中)。

還有一些可能性,以確定是否由於執行管理命令而運行代碼;如果它們包含任何管理命令,可以通過sys.argv明確檢查命令行參數。另一個可能性是通過服務器/管理命令指定運行應用程序的不同設置....

+0

這是我的也想到了。另一個不太完全的清理方法是使用MonkeyPatch django.core.management.base.py,特別是'BaseCommand.execute()',並在它周圍放置一個包裝。 –

+0

那麼,如果你喜歡猴子補丁肯定......你想首先獲得什麼? –

+0

嗯,首先,我想讓我的猴子在玩WoW時停止崩潰。 :-) –

0

如果您需要添加管理命令之前/之後的代碼不需要訪問django模型/設置,那麼您可以只需更新manage.py腳本。

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") 

from django.core.management import execute_from_command_line 
from startup import pre_management_command, post_management_command 

pre_management_command(sys.argv[1], sys.argv[2:]) 
execute_from_command_line(sys.argv) 
post_management_command(sys.argv[1], sys.argv[2:]) 

我不是100%肯定,但我想post_management_command將有機會獲得Django模型。

這僅僅是簡單的例子,在現實中你也會需要確保sys.argv至少有兩個條目和第二條目不-啓動,以防止假陽性呼叫像

./manage.py 
./manage.py -h 
./manage.py --help