zoukankan      html  css  js  c++  java
  • 五. 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)),
    
    ]

  • 相关阅读:
    面对对象1
    php数组
    操作字符串,正则表达式
    php运算符and函数
    sql 数学函数and字符串函数and日期函数
    高级查询
    简单查询
    php环境搭建
    第三阶段项目错误记录
    thinkphp获取刚添加数据的主键值
  • 原文地址:https://www.cnblogs.com/lovershowtime/p/11588471.html
Copyright © 2011-2022 走看看