zoukankan      html  css  js  c++  java
  • 单例模式和配置admin

                     单例模式的概念              

    单例模式主要目的是确保某一个类只有一个实例存在。
    比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。
    如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。
    事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

    python中实现单例模式的方法:
    1.使用__new__
    2.使用模块
    3.使用装饰器
    4.使用元类

    class Person():
        def __init__(self,name,age):
            self.name=name
            self.age=age
    alex=Person("alex",18)
    jerd=Person("jerd",18)
    print(id(Person),id(alex),id(jerd))
    1855204438680 1855238470960 1855238471072
    在内存中有三块地址,一块存放着类Person的信息,一块存这alex这个对象的信息,一块存这jerd这个对象的信息
    在Person这个类中,每实例化一个对象,就会创建一个新的地址。而单例模式要做的就是,不管创建多少个对象,所有的对象均指向同一块地址

    1.使用__new__

    class Singleton(object):
        __instance=None
        def __new__(cls, *args, **kwargs):
            if not cls.__instance:
                cls.__instance=super(Singleton,cls).__new__(cls,*args,**kwargs)
            return cls.__instance
    class Myclass(Singleton):
        a=1
    obj1=Myclass()
    obj2=Myclass()
    print(obj1,id(obj1)) #<__main__.Myclass object at 0x000001A786801048> 1819027705928
    print(obj2,id(obj2)) #<__main__.Myclass object at 0x000001A786801048> 1819027705928
    实例化时先执行new方法,在执行init方法.两个对象的内存地址相同,无论在创建多少个,所有的对象均指向同一内存地址

    2.使用模块

    Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。
    import 只要引入文件,只加载一次,第二次引入后不执行,直接拿第一次渠道的结果
    '''
    # mysingleton.py
    class My_Singleton(object):
        def foo(self):
            print("foo.....")
    my_singleton = My_Singleton()
    
    #func.py
    from mysingleton import my_singleton
    def bar():
        print(id(my_singleton))
    '''

    引用1:

    from mysingleton import my_singleton
    print(id(my_singleton))
    from mysingleton import my_singleton as my_singleton_new
    print(id(my_singleton_new))
    ##在第一次执行时,先加载mysingleton这个文件,然后执行my_singleton,生成一个对象地址,
    #第二次执行时,就不再加载mysingleton文件,取到第一次生成的对象地址

    引用2:

    import func
    func.bar()
    第一次引入func就执行func中的内容,func中的from mysingleton import my_singleton已经执行过,生成了mysingleton对象
    func.bar在取值时,只能取到已经生成的mysingleton对象

    引用3:

    from mysingleton import my_singleton,My_Singleton
    mn1=My_Singleton
    ms1=My_Singleton()
    from mysingleton import my_singleton,My_Singleton
    mn2=My_Singleton
    ms2=My_Singleton()
    print(id(ms1))
    print(id(ms2))
    print(id(mn1)) #1707140026296
    print(id(mn2)) #1707140026296
    print(id(ms1)) #1707173772984
    print(id(ms2)) #1707173773040
    ##在第一次执行时,先加载mysingleton这个文件,然后执行my_singleton和My_Singleton,分别生成一个对象地址和类地址
    ##第二次执行时,就不再加载mysingleton文件,分别取到第一次生成的对象地址和空间地址,但是相同的类地址在实例化时,生成不同地址的对象

                             配置admin                      

    1.在setting中配置,Django已经配置

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

    2.在urls中配置admin路由

    from django.conf.urls import url
    from django.contrib import admin
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
    ]

    3.创建超级用户,登陆admin

    python manage.py createsuperuser 在127.0.0.1:8000/admin/登陆

    4.在models中创建类orm,并在admin.py中注册这些类,在后台就能对创建的表进行管理

    '''
    from django.db import models
    # Create your models here.
    class Book(models.Model):
        title=models.CharField(max_length=255)
        price=models.IntegerField()
        publisher=models.ForeignKey(to="Publisher")
        authors=models.ManyToManyField(to='Userinfo')
        def __str__(self):
            return title
    class Publisher(models.Model):
        title=models.CharField(max_length=255)
        addr=models.CharField(max_length=255)
        def __str__(self):
            return title
    class Userinfo(models.Model):
        name=models.CharField(max_length=255)
        age=models.IntegerField()
        phone=models.BigIntegerField()
        def __str__(self):
            return name
    '''
    models.py
    '''
    from django.contrib import admin
    # Register your models here.
    from MY_Blog import models
    admin.site.register(models.Book)
    admin.site.register(models.Publisher)
    admin.site.register(models.Userinfo)
    
    '''
    admin.py

    5.admin处理

    admin model:
        对每一个app下的model设计出增伤改查4个url
            查看book:
            http://127.0.0.1:8000/admin/app01/book/
            添加book: 
            http://127.0.0.1:8000/admin/app01/book/add/    
            编辑book:
            http://127.0.0.1:8000/admin/app01/book/1/change/
            删除book:
            http://127.0.0.1:8000/admin/app01/book/1/delete/

                    自定义admin             

    1.自定义admin内容

    from django.contrib import admin
    # Register your models here.
    from MY_Blog import models
    from django.utils.safestring import mark_safe
    #以图书设置为示例:
    class Custom_book(admin.ModelAdmin):
        def deletes(self):
            return mark_safe("<a href=''>删除</a>") #不添加safe属性,会把标签显示出来
        #1.自定义admin显示的字段。多对多的字段不能加,否则报错
        # list_display = ["title","price","publisher",]
        #2.指定特定字段进入编辑
        list_display_links = ["title","price"]
        #3.在admin中添加新字段,在类中定义一个方法,返回响应字段
        list_display = ["title", "price", "publisher",deletes ]
        #4.根据字段进行分类,在页面右侧出现filter区
        list_filter=["price","title","authors","publisher"]
        #5.搜素框,根据定义的字段进行搜素,模糊查找
        search_fields = ["title", "price"]
        #6.更改页面
        # change_list_template="list.html" 基本不用
        #7.在编辑时,只能对定义的字段编辑
        # fields = ('title',)
        #8.批处理
        def patch_init(self,request,queryset):
            queryset.update(price=100) #对价格进行更改
        patch_init.short_description = "批量初始化"
        actions = [patch_init, ]
    admin.site.register(models.Book,Custom_book)
    admin.site.register(models.Publisher)
    admin.site.register(models.Userinfo)

    2.自定义admin显示中文

    #1.将Django自身内容设置为中文
    在setting.py中修改LANGUAGE_CODE ='zh-hans'
    #2.给创建的表名和字段起别名(中文显示),在models中给表加verbose_name属性
    class Book(models.Model):
        title=models.CharField(max_length=255 ,verbose_name="题目" )
        price=models.IntegerField(verbose_name='价格')
        publisher=models.ForeignKey(to="Publisher",verbose_name='出版社')
        authors=models.ManyToManyField(to='Userinfo',verbose_name='作者')
        def __str__(self):
            return self.title
    class Meta:  #对表名操作
        verbose_name = "图书信息"  # 给表起别名。默认会加s
        verbose_name_plural = verbose_name  # 设置为复数形式
     
     
  • 相关阅读:
    Ubuntu Dash 添加 Sublime Text 图标
    Ubuntu14.04修改DNS服务
    VNC viewer访问Ubuntu 14.04
    GPT和parted命令详解
    linux 标准IO缓冲机制探究
    浅谈无缓存I/O操作和标准I/O文件操作区别
    jsp利用request获取当前的链接地址
    eclipse jsp formatter
    spring bean
    ubuntu google-chrome-stable
  • 原文地址:https://www.cnblogs.com/zgf-666/p/9119246.html
Copyright © 2011-2022 走看看