1. 程式人生 > 其它 >django原始碼解讀python manage.py shell

django原始碼解讀python manage.py shell

當在進入 python 環境中匯入 django 模組類

我們看一下哪裡的問題,導致報錯。

ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
主要是 獲取環境中的 ENVIRONMENT_VARIABLE 變數,這個變數在manage.py 中設定了

當我們手動輸入 ENVIRONMENT_VARIABLE 之後,又出現了一個錯誤。

這是執行報錯的函式

這段程式碼的執行原因是 self.apps_ready = False, 然後執行報錯
接下來就是 看變數 self.apps_ready 在哪裡賦值的

在register.py 中有5個地方提到self.apps_ready,除掉賦值為False 的,只有兩個地方為 True
第一個在 unset_installed_apps() 函式中,定義為 True,這個函式是去掉註冊的apps, 在執行時沒有呼叫這個函式。所以這個也不是,
第二個在 populate() 函式中賦值為True,然後看這個函式是否被呼叫,這個函式在django初始化 setup() 函式中會呼叫,然後去看setup 在哪裡被呼叫

setup() 會在執行manage.py 中呼叫execute() 函式中呼叫,可以去看上一篇講解 startproject 中講 執行execute () 函式


現在就沒有報錯了,可以去執行一些ORM 操作。

接下來,我們看shell原始碼

在django執行過程中會去呼叫 handle 方法

handle()函式先去檢查引數,然後檢查平臺不是win32並且不是在終端,他會退出,一般執行的話不會執行這段程式碼。

如果沒有 -i 選項指定python核心,就會用上面定義的三種python 核心

下面這個for迴圈遍列表,getattr獲取Command中的ipython,bpython,python函式,後面還有引數,如果匯入錯誤,就會進入下一次迴圈。如果迴圈結束也沒能進入python環境,就會丟擲異常。一般這種情況很少見。