Django admin原始碼的分析(附範例)

不言
發布: 2018-10-08 15:56:08
轉載
2108 人瀏覽過

這篇文章帶給大家的內容是關於Django admin原始碼的分析(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

單例模式

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

例如,某個伺服器程式的設定資訊存放在一個檔案中,客戶端透過一個 AppConfig 的類別來讀取設定檔的資訊。如果在程式運行期間,有很多地方都需要使用設定檔的內容,也就是說很多地方都需要創建AppConfig 對象的實例,這就導致系統中存在多個AppConfig 的實例對象,而這樣會嚴重浪費記憶體資源,尤其是在設定檔內容很多的情況下。事實上,類似 AppConfig 這樣的類,我們希望在程式運行期間只存在一個實例物件。

在Python 中,我們可以用多種方法來實作單例模式:

  • #使用__new__()

  • # #使用模組

  • 使用裝飾器(decorator)

  • #使用元件類別(metaclass)

# #1.使用__new__()方式

為了讓類別只能出現一個實例,我們可以使用 

__new__()

 來控制實例的建立過程,程式碼如下:

__new__()方法用來建立實例物件

__init__()方法用來初始化實例物件

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        print(1)
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

    def __init__(self, name, age):
        print(2)
        self.name = name
        self.age = age
if __name__ == '__main__':
    p1 = Person("djb", 18)
    p2 = Person("djb", 18)

    print(p1 == p2)
    print(id(p1), id(p2))

    print("=" * 120)

    s1 = Singleton("djb", 18)
    s2 = Singleton("djb", 18)
    print(s1 == s2)
    print(id(s1), id(s2))
登入後複製

2、使用模組方式######其實,Python 的模組就是天然的單例模式,因為模組在第一次導入時,會產生.pyc 文件,當第二次導入時,就會直接載入.pyc 文件,而不會再執行模組碼。因此,我們只要把相關的函數和資料定義在一個模組中,就可以獲得一個單例物件了。 ######如果我們真的想要一個單例類,可以考慮這樣做:###
class Singleton(object):    
def __init__(self, name, age):
        self.name = name
        self.age = age
p1 = Singleton("djb", 18)
登入後複製
###使用下面的程式碼測試一下:###
from singleton import p1

print(id(p1))
print(p1.name)
p1.name = "Bob"

from singleton import p1

print(id(p1))
print(p1.name)
登入後複製
###剩下那兩種自己查資料唄...######admin執行流程###### <1>循環載入執行所有已經註冊的app中的admin.py檔案###
def autodiscover():
    autodiscover_modules(&#39;admin&#39;, register_to=site)
登入後複製
###<2>執行代碼###
#admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ("title",&#39;publishDate&#39;, &#39;price&#39;)
admin.site.register(Book, BookAdmin) 
admin.site.register(Publish)
登入後複製
###<3> admin.site  ###############這裡應用的是單例模式,對於AdminSite類別的一個單例模式,執行的每一個app中的每一個admin.site都是一個物件######<4> 執行register方法###
admin.site.register(Book, BookAdmin) 
admin.site.register(Publish)
登入後複製
class ModelAdmin(BaseModelAdmin):pass
def register(self, model_or_iterable, admin_class=None, **options):
    if not admin_class:
            admin_class = ModelAdmin
    # Instantiate the admin class to save in the registry
    self._registry[model] = admin_class(model, self)
登入後複製
###到這裡,註冊結束! ######<5> admin的URL配置###
urlpatterns = [
    url(r&#39;^admin/&#39;, admin.site.urls),
]
登入後複製
class AdminSite(object):
    
     def get_urls(self):
        from django.conf.urls import url, include
        urlpatterns = []
        # Add in each model&#39;s views, and create a list of valid URLS for the
        # app_index
        valid_app_labels = []
        for model, model_admin in self._registry.items():
            urlpatterns += [
                url(r&#39;^%s/%s/&#39; % (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
    @property
    def urls(self):
        return self.get_urls(), &#39;admin&#39;, self.name
登入後複製
###<6>  url()方法的擴展應用###
from django.shortcuts import HttpResponse
def test01(request):
    return HttpResponse("test01")
def test02(request):
    return HttpResponse("test02")
urlpatterns = [
    url(r&#39;^admin/&#39;, admin.site.urls),
    url(r&#39;^Xadmin/&#39;, ([
                    url(r&#39;^test01/&#39;, test01),
                    url(r&#39;^test02/&#39;, test02),

                    ],None,None)),
]
登入後複製
###擴展優化###
from django.conf.urls import url,include
from django.contrib import admin
from django.shortcuts import HttpResponse
def change_list_view(request):
    return HttpResponse("change_list_view")
def add_view(request):
    return HttpResponse("add_view")
def delete_view(request):
    return HttpResponse("delete_view")
def change_view(request):
    return HttpResponse("change_view")
def get_urls():
    temp=[
        url(r"^$".format(app_name,model_name),change_list_view),
        url(r"^add/$".format(app_name,model_name),add_view),
        url(r"^\d+/del/$".format(app_name,model_name),delete_view),
        url(r"^\d+/change/$".format(app_name,model_name),change_view),
    ]
    return temp
url_list=[]

for model_class,obj in admin.site._registry.items():
    model_name=model_class._meta.model_name
    app_name=model_class._meta.app_label

    # temp=url(r"{0}/{1}/".format(app_name,model_name),(get_urls(),None,None))
    temp=url(r"{0}/{1}/".format(app_name,model_name),include(get_urls()))
    url_list.append(temp)

urlpatterns = [
    url(r&#39;^admin/&#39;, admin.site.urls),
    url(r&#39;^Xadmin/&#39;, (url_list,None,None)),
]
登入後複製

以上是Django admin原始碼的分析(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板