五. django自带admin页面的使用,单例模式理解,自定admin组件

一. django自带admin页面的使用

https://www.cnblogs.com/yuanchenqi/articles/8323452.html         Django-admin管理工具

https://www.cnblogs.com/lovershowtime/p/11353293.html           admin管理后台

Django 提供了基于 web 的管理工具。

Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它:

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "app01"
]

 二 .单例模式(admin就用了单例模式) 

https://www.cnblogs.com/Sup-to/p/11094767.html     面向对象 单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
单例模式:基于某种方法实例化多次得到实例是同一个
当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
减少内存占用
# 单例模式__new__ 方法一

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,'_instance'):
            orig=super(Singleton,cls)
            cls._instance=orig.__new__(cls,*args,**kwargs)
        return cls._instance

class MyClass(Singleton):
    a=1
one=MyClass()
two=MyClass()
one.a=20
two.a=30
# one和two完全相同,可以用id(),==,is检查
print(one.a)    #
print (two.a)
print(id(one))  #
print(id(two))  #
print(one == two)   # True
print(one is two)   # True


# 30
# 30
# 2418859210792
# 2418859210792
# True
# True
# 单例模式装饰器 方法二
def singleton(cls, *args, **kwargs):
    instances = {}
    def _singleton():
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return _singleton
@singleton
class MyClass3(object):
    a = 1
one = MyClass3()
two = MyClass3()
print(id(one))  # 2880466769232
print(id(two))  # 2880466769232
print(one == two)  # True
print(one is two)  # True

 使用模块(单例模式)

其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,
而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做
sing.py

class Sun(object):  # 在导出前会产生一个临时pyc的文件 打包过去
    aa=100
    def run(self):
        print (self.aa)
ss=Sun()
print ("ok!!!")

print ("rrrrrrrrrrrrrrrrrrrrrrrrrr")
main.py

# 导个来的文件只加载一次去临时文件pyc中取值    第二次导入没得任何意义            天生的单例

from  sing import  ss
ss.run()
print (id(ss.run()))


# from  sing import  ss
ss.run()
print (id(ss.run()))


# ok!!!
# rrrrrrrrrrrrrrrrrrrrrrrrrr
# 100
# 100
# 1720755408
# 100
# 100
# 1720755408


sing.py
class Sun(object): aa=100 def run(self): print (self.aa) ss=Sun() print ("ok!!!") print ("rrrrrrrrrrrrrrrrrrrrrrrrrr") # 在导出前会产生一个临时pyc的文件 打包过去
fun.py


from sing import  ss  # 这个ss是Sun类的实例对象

def foo():
    print (id(ss),"ok11111111")
main.py

# 导个来的文件只加载一次去临时文件pyc中取值    第二次导入没得任何意义            天生的单例

from sing import  ss  # 这个ss是Sun类的实例对象
print (id(ss))


from sing import  ss   # 这个ss是Sun类的实例对象
print (id(ss))


from  fun import *
foo()

# 这三个文件都是一个程序      只要属于这一个程序 其他他地方导入都都是一个对象

# ok!!!
# rrrrrrrrrrrrrrrrrrrrrrrrrr
# 2241649670520
# 2241649670520
# 2241649670520 ok11111111

 

sing.py

class Sun(object):
    aa=100
    def run(self):
        print (self.aa)
ss=Sun()
print ("ok!!!")
print ("rrrrrrrrrrrrrrrrrrrrrrrrrr")

# 在导出前会产生一个临时pyc的文件 打包过去
func.py


from sing import  ss

def foo():
    print (id(ss),"ok11111111")
main.py

# 导个来的文件只加载一次去临时文件pyc中取值    第二次导入没得任何意义            天生的单例

from sing import  ss,Sun #  Sun类对象
print (id(ss))


a=Sun()
print (id(a))


b=Sun()
print (id(b))

#
# ok!!!
# rrrrrrrrrrrrrrrrrrrrrrrrrr
# 1267286899120
# 1267285115232
# 1267286898784

 三. 自定admin组件

admin执行流程   【print(admin.site._registry) # 执行结果

 循环加载执行所有已经注册的app中的admin.py文件

def autodiscover():
    autodiscover_modules('admin', register_to=site)
<2> 执行代码


#admin.py

class BookAdmin(admin.ModelAdmin):
    list_display = ("title",'publishDate', 'price')

admin.site.register(Book, BookAdmin) 
admin.site.register(Publish)

admin.site  


这里应用的是一个单例模式,对于AdminSite类的一个单例模式,执行的每一个app中的每一个admin.site都是一个对象

执行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)


思考:在每一个app的admin .py中加上

print(admin.site._registry)   # 执行结果?
到这里,注册结束!

 admin的URL配置

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

  一. url()方法的扩展应用(最初的url设计)

from django.shortcuts import HttpResponse
def test01(request):
    return HttpResponse("test01")

def test02(request):
    return HttpResponse("test02")

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^yuan/', ([
                    url(r'^test01/', test01),
                    url(r'^test02/', test02),

                    ],None,None)),

]

 

posted @ 2019-09-26 00:02  supreme999  阅读(333)  评论(0编辑  收藏  举报