日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1月24日学习内容整理:Django的admin组件源码分析及流程

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1月24日学习内容整理:Django的admin组件源码分析及流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、單例模式

單例模式(Singleton Pattern)是一種常用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。

比如,某個服務器程序的配置信息存放在一個文件中,客戶端通過一個 AppConfig 的類來讀取配置文件的信息。如果在程序運行期間,有很多地方都需要使用配置文件的內容,也就是說,很多地方都需要創建 AppConfig 對象的實例,這就導致系統中存在多個 AppConfig 的實例對象,而這樣會嚴重浪費內存資源,尤其是在配置文件內容很多的情況下。事實上,類似 AppConfig 這樣的類,我們希望在程序運行期間只存在一個實例對象。

》》》基于_ _new_ _方法,在init之前執行的方法

》》》基于模塊:其實,Python 的模塊就是天然的單例模式,因為模塊在第一次導入時,會生成?.pyc?文件,當第二次導入時,就會直接加載?.pyc?文件,而不會再次執行模塊代碼。因此,我們只需把相關的函數和數據定義在一個模塊中,就可以獲得一個單例對象了。

在一個Django程序中,模塊被加載執行一次后再導入的話就不會再執行模塊中的代碼了

》》》基于裝飾器decorator

》》》使用元類(metaclass)

?

二、admin的源碼執行流程

admin源碼的核心是兩個類:

》》》ModelAdmin:主要用來定制樣式,也就是頁面效果

》》》AdminSite:主要做admin應用,也就是增刪改查的功能

1、Django項目啟動時,會按照settings中配置的注冊app順序依次加載app文件,也就會執行app文件中所有的_ _init_ _方法。如下圖,第一個就是admin

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01.apps.App01Config','app02.apps.App02Config','stark.apps.StarkConfig', ]

admin中的_ _init_ _文件中的autodiscover_modules('admin', register_to=site)方法就會按順序掃描加載每一個注冊的app中的admin.py文件并執行

2、執行app的admin文件:

#admin.pyclass BookAdmin(admin.ModelAdmin):list_display = ("title",'publishDate', 'price')admin.site.register(Book, BookAdmin) admin.site.register(Publish)

查看admin源碼,admin.site就是一個單例對象,對于AdminSite類的一個單例模式,執行的每一個app中的每一個admin.site都是一個對象,自始至終只有這一個對象

接下來就會執行這個對象的register方法,查看源碼,核心就是以下內容,首先判斷是否有自定義的樣式類,再是創建一個字典,添加一組鍵值對,鍵就是傳入的model的類對象,也就是models.py中定義的類,對應的值是自定義樣式類的對象或者是ModelAdmin對象

class ModelAdmin(BaseModelAdmin):passdef register(self, model_or_iterable, admin_class=None, **options):if not admin_class:admin_class = ModelAdmin# Instantiate the admin class to save in the registryself._registry[model] = admin_class(model, self)

每一個app的admin文件執行完后,我們就會得到一個字典,鍵就是model類,值是樣式類(ModelAdmin或自定義的)的對象這樣一組組鍵值對,并且始終只有一個AdminSite對象

3、到這一步admin注冊就結束了,接下來就是等待用戶的URL

4、admin的URL配置

全局urls文件中

urlpatterns = [url(r'^admin/', admin.site.urls), ]

urls方法的源碼,核心內容如下,主要就是在調用get_urls方法,這個方法就會定義一個空列表,循環我們注冊admin完畢時得到的字典,利用app文件名和model的類名拼接再加上視圖函數得到一個個的url方法對象,把這一個個對象放到這個空列表中,在返回這個列表,對于全局urls文件來說,就相當于include做了一個一個的URL拼接

實際上,admin.site對象的urls方法就是實現路由分發的,使得一條路由能夠代表多條URL

class AdminSite(object):def get_urls(self):from django.conf.urls import url, includeurlpatterns = []# Add in each model's views, and create a list of valid URLS for the# app_indexvalid_app_labels = []for model, model_admin in self._registry.items():urlpatterns += [url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),]if model._meta.app_label not in valid_app_labels:valid_app_labels.append(model._meta.app_label)return urlpatterns@propertydef urls(self):return self.get_urls(), 'admin', self.name

?

轉載于:https://www.cnblogs.com/wanghl1011/articles/8341516.html

總結

以上是生活随笔為你收集整理的1月24日学习内容整理:Django的admin组件源码分析及流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。