您好,登錄后才能下訂單哦!
關于admin:
(1) admin的概述:
admin是一個django子代的組件,當創建一個項目會后,就會在settings文件的 INSTALLED_APPS 中自動注冊,另外在urls.py 文件中同樣存在admin的路由
INSTALLED_APPS = [ #自帶并且注冊的一個組件即app 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes',
urlpatterns = [ # 自動存在的admin路由 url(r'^admin/', admin.site.urls), url(r'^stark/', site.urls), ]
(2) admin 的執行流程
當django程序加載的時候,自動循環加載已經注冊的APP中的admin.py文件然后執行
#在admin.py文件中有一個__init__文件 ,其中有代碼如下 #意思是:程序的啟動自動尋找名為admin的py文件,然后執行 def autodiscover(): autodiscover_modules('admin', register_to=site)
#具體的方法如下: def autodiscover_modules(*args, **kwargs): """ Auto-discover INSTALLED_APPS modules and fail silently when not present. This forces an import on them to register any admin bits they may want. You may provide a register_to keyword parameter as a way to access a registry. This register_to object must have a _registry instance variable to access it. """
執行admin.py文件中的內容
# 在django啟動時候,系統自動加載 from django.contrib import admin #導入該APP下的models from DRF import models #此處是一個單例模式 admion.site admin.site.register(models.Publisher)
單例模式site 這里應用的是一個單例模式,對于AdminSite類的一個單例模式,執行的每一個App中的每一個admin.site都是一個對象
# AdminSite 類 class AdminSite(object): ... def __init__(self, name='admin'): self._registry = {} # model_class class -> admin_class instance self.name = name self._actions = {'delete_selected': actions.delete_selected} self._global_actions = self._actions.copy() all_sites.add(self) .... site = AdminSite()
執行register方法
# AdminSite中的register 方法 def register(self, model_or_iterable, admin_class=None, **options): """ Registers the given model(s) with the given admin class. The model(s) should be Model classes, not instances. If an admin class isn't given, it will use ModelAdmin (the default admin options). If keyword arguments are given -- e.g., list_display -- they'll be applied as options to the admin class. If a model is already registered, this will raise AlreadyRegistered. If a model is abstract, this will raise ImproperlyConfigured. """
知識補充: 單例模式
a.py
class AdminSite(object): def __init__(self): self._registry = {} obj1 = AdminSite()
b.py
import a a.obj1._registry['k2'] = 666
c.py
import a a.obj1._registry['k1'] = 123 print(a.obj1._registry)
單例模式的實現方法
1:使用模塊
Python的模塊就是天然的單例模式。
因為模塊在第一次導入時,會生成 .pyc 文件,當第二次導入時,就會直接加載 .pyc 文件,而不會再次執行模塊代碼。
因此,我們只需把相關的函數和數據定義在一個模塊中,就可以獲得一個單例對象了。
例如:
class V1(object): def foo(self) pass V1 = V1()
將上面代碼保存在文件test.py,要使用時,直接在其他文件中導入此文件中的對象,這個對象既是單例模式的對象
如:from a import V1
2:使用裝飾器
def Singleton(cls): _instance = {} def _singleton(*args, **kargs): if cls not in _instance: _instance[cls] = cls(*args, **kargs) return _instance[cls] return _singleton @Singleton class A(object): a = 1 def __init__(self, x=0): self.x = x a1 = A(2) a2 = A(3)
3:使用類
4:基于__new__方法實現
當我們實例化一個對象時,是先執行了類的__new__方法
當:(我們沒寫時,默認調用object.__new__),實例化對象;然后再執行類的__init__方法,對這個對象進行初始化,所有我們可以基于這個,實現單例模式
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。