使用中間件,我可以在每個HTTP請求的開始和結束處執行代碼。在任何django管理命令之前運行代碼
隨着芹菜任務,我可以通過使用task_prerun
和task_postrun
信號完成相同的操作。
那麼django管理命令呢?是否有可能在每個django管理命令的開頭(可能是結尾)運行代碼?此類代碼還必須知道哪個django管理命令即將運行(或已完成運行)。有一張關於signal on application startup的票可能會或可能不會做我想要的,但它還沒有準備好。
使用中間件,我可以在每個HTTP請求的開始和結束處執行代碼。在任何django管理命令之前運行代碼
隨着芹菜任務,我可以通過使用task_prerun
和task_postrun
信號完成相同的操作。
那麼django管理命令呢?是否有可能在每個django管理命令的開頭(可能是結尾)運行代碼?此類代碼還必須知道哪個django管理命令即將運行(或已完成運行)。有一張關於signal on application startup的票可能會或可能不會做我想要的,但它還沒有準備好。
正如你正確地陳述有Django中沒有具體的地方,你可以把在每次啓動時執行的代碼...
有一些地方,你可能能夠「濫用」這一目的,例如。應該在啓動時運行urls.py
或models.py
中的代碼...(例如,管理員將此情況用於其admin.autodiscover()
在urls.py
中)。
還有一些可能性,以確定是否由於執行管理命令而運行代碼;如果它們包含任何管理命令,可以通過sys.argv
明確檢查命令行參數。另一個可能性是通過服務器/管理命令指定運行應用程序的不同設置....
如果您需要添加管理命令之前/之後的代碼不需要訪問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
這是我的也想到了。另一個不太完全的清理方法是使用MonkeyPatch django.core.management.base.py,特別是'BaseCommand.execute()',並在它周圍放置一個包裝。 –
那麼,如果你喜歡猴子補丁肯定......你想首先獲得什麼? –
嗯,首先,我想讓我的猴子在玩WoW時停止崩潰。 :-) –