Django框架-源碼-03settings源碼剖析

from django.conf import settings 局部的配置字典django

from django.conf import settings.global_settings 全局的配置字典對象

在manage中給os.environ配過值 對應的DJANGO_SETTINGS_MODULE 就是咱們用的settings字符串

局部的settings 就是一個 LazySettings類的 單例對象get

在類中 settings_module 爲 os.environ.get(ENVIRONMENT_VARIABLE)使之就是 項目的seting文件, 以後又有一個 Settings類把這個settings_module傳了進去it

以後Settings中的init的方法中 dir(global_settings)迭代了全部全局的配置文件, 對其進行大寫判斷,成立,就爲它賦對象屬性值 這邊key 爲迭代的名字 值爲getattr(global_settings, settings) 對應配置文件裏面的 全大寫關鍵字變量賦值import

self.SETTINGS_MODULE = settings_module變量

而後 importlib.import_module(self.SETTINGS_MODULE) 獲取了暴露給用戶的配置文件, 對其的屬性遍歷,判斷其大寫的屬性, getattr反射大寫變量名對應值, 而後對其進行key,value賦值 ,這邊對應的都是在Settings類中對self對象的屬性修改,因此對其的修改值就會起覆蓋做用module

最後實現了項目裏面本身配置的用本身的, 沒有就用默認的全局的,這一個理想效果配置

manage.py遍歷

from django.conf imoprt settings

LazySettings => _setup => Settings => __init__(for->isupper->setattr)(把全局字典裏面的字符串轉化爲對象的屬性) => self.SETTINGS_MODULE => importlib.import_module() =>(for->isupper->getattr->settattr)(把settings轉化後的字典的重名屬性替換對象原從全局字典得到的屬性,這樣就實現了新屬性代替老屬性,settings裏面配置的就會取代默認屬性生效)

相關文章
相關標籤/搜索