admin組件詳解
先根據admin組件啟動流程複習下django項目啟動至請求過來發生的事
1將admin組件註冊進app
2django項目啟動
3在運行到定製的admin時執行其下面的apps檔案中類下面ready函數在項目啟動時就執行每個app下面的admin檔案
4當使用者發送請求進來首先經過wsgi處理
5再運行中介軟體中的各個組件對請求進行處理
6在url中找到對應的視圖函數並執行返回一個response對象
7返回對象再經過中介軟體處理(此時執行順序是從後往前)
流程
知識點
1、django admin利用的是python專屬的單例模式來調用的再python中每一個py檔案的執行都會產生一個pyc的檔案,當下次再調用時,並不會在執行一次py檔案, 而是拿到先前生pyc檔案的空間中的資料。
2、 改寫方法指定app啟動時,執行每個app目錄下的stark檔案
def ready(self): autodiscover_modules('stark')
3通過查看源碼admin中的註冊方法通過site調用,site即一個檔案類中產生的單例對象,建立檔案定義一個產生site對象的方法,定義register方法
class StarkSite(object): def __init__(self, name='admin'): self._registry = {} #記錄註冊的model類 def register(self, model, admin_class=None, **options): if not admin_class: admin_class = ModelStark # 配置類 self._registry[model] = admin_class(model)
4model註冊進此時應該產生對應的url,每張表都應該有自己專屬的url,url對應著表中資料的增刪改查,那麼設計url尤為重要,此時我們採用url分發的方法,一級路由由表名進行命名,二級路由另外寫個類,用來調用(因為site是單例,如果寫在一個類裡面,則每個url都需要產生4個url,代碼重複,應該在使用者訪問某張表的時候產生對應的增刪改查路由)
#一級路由代碼
def get_urls(self): temp = [] for model_class, config_obj in self._registry.items(): print("===>", model_class, config_obj) model_name = model_class._meta.model_name app_label = model_class._meta.app_label print("===>", app_label, model_name) temp.append(url(r'^%s/%s/' % (app_label, model_name),config_obj.urls))
5、config_obj是配置類對象,二級路由放入配置類中,在使用者註冊時,如果有自己的配置類則用自己的 ,沒有則用預設的
def get_urls(self): temp=[ url("^$",self.list_view,name="%s_%s_list"%(self.app_model_name)), url("^add/$",self.add_view,name="%s_%s_add"%(self.app_model_name)), url("^(\d+)/change/$",self.change_view,name="%s_%s_change"% (self.app_model_name)), url("^(\d+)/delete/$",self.delete_view,name="%s_%s_delete"%(self.app_model_name)), ] temp.extend(self.extra_urls()) return temp@property #此裝飾器的作用是讓方法變成可以像屬性一樣調用def urls(self): return self.get_urls(),None,None
6在裝飾類下定義增刪改查4個視圖方法
流程圖
>
至於增刪改查視圖中的方法就步過介紹了,自訂admin組件的基本邏輯就是這樣