• url方法使用与单例模式


    一、url方法使用

    from django.contrib import admin
    from django.urls import path, include
    from django.conf.urls import url
    from django.shortcuts import HttpResponse
    
    
    def book(request):
        return HttpResponse("book")
    
    
    def test01(request):
        return HttpResponse("test01")
    
    
    def test02(request):
        return HttpResponse("test02")
    
    
    def test03(request):
        return HttpResponse("test03")
    
    
    def test04(request):
        return HttpResponse("test04")
    
    
    def test05(request):
        return HttpResponse("test05")
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        # 情况1  http://127.0.0.1:8080/book/
        url(r'^book/', book),
        # 情况2   http://127.0.0.1:8080/yuan/test01/  或者 http://127.0.0.1:8080/yuan/test03/test04/
        url(r'^yuan/', ([url(r"^test01/", test01),
                        url(r"^test02/", test02),
                        url(r"^test03/", ([url(r'^test04/', test04),
                                         url(r'^test05/', test05)], None, None)),
                        ], None, None)),
    
        # 使用include对“情况2”进行封装,在app下新建urls.py,写入相应url
        # http://127.0.0.1:8080/yuan/test01/
        url(r'^yuan/', include("app01.urls"))
    ]
    View Code

    二、单例模式

    1、使用__new__方法创建单例模式:

    # tests.py 
    
    # 单例模式:  一个类只允许实例化出一个对象   如配置文件
    # 实现单例模式的方法:通过模块;通过__new__;使用装饰器;使用元类
    
    
    # 1、使用__new__方法
    class Singleton(object):
        _instance = None
    
        def __new__(cls, *args, **kwargs):
            if not cls._instance:  # 如果不为None
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
            return cls._instance
    
    
    class MyClass(Singleton):
        a = 1
    
    
    one = MyClass()
    tow = MyClass()
    
    print(one == tow)
    print(id(one), id(tow))  # 打印两个对象的内存地址
    View Code

    2、使用python模块创建单例模式:

    # 使用python模块创建单例模式
    
    # my_singleton.py
    
    
    class MySingleton():
        x = 1
    
        def foo(self):
            print(self.x)
    
    
    my_singleton = MySingleton()
    
    
    ————————————————————————————————
    # func.py
    
    from my_singleton import my_singleton
    
    
    def bar():
        print("in bar:", id(my_singleton))
    
    
    ————————————————————————————————
    # main.py
    
    from my_singleton import my_singleton, MySingleton
    
    print(id(my_singleton))
    
    a = MySingleton()
    b = MySingleton()
    print("a和b的内存地址:", id(a), id(b))  # 打印发现a、b两个实例的内存地址不一样,因为此时的MySingleton只是一个普通类被实例化
    
    
    from my_singleton import my_singleton
    
    print(id(my_singleton))
    
    
    from func import bar
    bar()
    
    # 打印发现三次实例化的my_singleton的内存地址是一样的
    # 在python中  模块一旦被导入,就不会再导入第二次,之后再执行它,依然是第一次导入的那个文件
    View Code

    3、Django的单例模式(使用模块实现单例)

    新建一个Django项目,新建app01(步骤略)

    app01.models.py

    from django.db import models
    
    
    class Book(models.Model):
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=6, decimal_places=2)
        pub_date = models.DateField()
        authors = models.ManyToManyField(to="Author")
    
        def __str__(self):
            return self.title
    
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
    
        def __str__(self):
            return self.name
    View Code

    做数据库迁移(略)

    app01.admin.py

    from django.contrib import admin
    from app01.models import *
    
    # Register your models here.
    
    
    class BookConfig(admin.ModelAdmin):
        """自定制类  使得在admin数据库管理页面可以看到自己想要看的信息"""
        list_display = ["title", "price", "pub_date"]  # 多对多字段不可以用于此处
        list_display_links = ["title"]  # 设置可链接的字段  设置后,点击该字段便可以进入编辑页面
        list_filter = ["pub_date"]  # 以所设置的字段作为筛选器 进行记录查询
        list_editable = ["price"]  # 设置可编辑字段,注意:如果在list_display_links中设置了的字段,在此处不可以再设置
        search_fields = ["title", "price"]  # 设置检索字段(模糊查询:输入关键字即可查询)
        date_hierarchy = "pub_date"  # 过滤日期
    
        # action:批量操作记录
        def func(self, request, queryset):  # request:请求  queryset:所选中的那些你想要操作的数据
            print(self, request, queryset)
            # 对选中记录作操作:
            queryset.update(pub_date="2012-1-1")  # 将所选记录的出版日改为2012年1月1日
        func.short_description = "出版日改为2012年1月1日"
        actions = [func,]
    
        fields = ["title", "price", "pub_date", "authors"]  # 在添加记录的页面显示的字段
        # exclude = ["pub_date"]  # 在添加记录的页面不显示的字段,与fields相反
    
        ordering = ["id"]  # 按id升序排列   降序用["-id"]
    
    
    admin.site.register(Book, BookConfig)  # 源码:register(self, model_or_iterable, admin_class=None, **options)
    # model_or_iterable=Book, admin_class=BookConfig
    
    print(admin.site._registry)
    """
    {<class 'django.contrib.auth.models.Group'>: <django.contrib.auth.admin.GroupAdmin object at 0x0000000003C1C2B0>, 
    <class 'django.contrib.auth.models.User'>: <django.contrib.auth.admin.UserAdmin object at 0x0000000003C4E128>, 
    <class 'app01.models.Book'>: <app01.admin.BookConfig object at 0x0000000003C58F98>}
    
    有3张表存在
    """
    
    admin.site.register(Author)
    View Code

    再新建app02,在settings.py中配置好app02:

    app02.models.py

    from django.db import models
    
    
    class Book2(models.Model):
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=6, decimal_places=2)
        pub_date = models.DateField()
    
        def __str__(self):
            return self.title
    View Code

     数据库迁移(略)

    app02.admin.py

    from django.contrib import admin
    from app02.models import *
    
    
    admin.site.register(Book2)
    
    print(admin.site._registry)
    """
    {<class 'django.contrib.auth.models.Group'>: <django.contrib.auth.admin.GroupAdmin object at 0x0000000003C1FA58>, 
    <class 'django.contrib.auth.models.User'>: <django.contrib.auth.admin.UserAdmin object at 0x0000000003C4B8D0>, 
    <class 'app01.models.Book'>: <app01.admin.BookConfig object at 0x0000000003C5D7B8>, <class 'app01.models.Author'>: <django.contrib.admin.options.ModelAdmin object at 0x0000000003C5D780>, 
    <class 'app02.models.Book2'>: <django.contrib.admin.options.ModelAdmin object at 0x0000000003C5D8D0>}
    
    再新建一个app02,创建一个model:Book2后,打印发现有四张表
    这就是单例模式,所有app共用一个admin配置
    """
    View Code

     总结:

      使用模块创建单例:创建一个模块,里面新建一个类,再实例化这个类,在其他模块中导入这个实例化的对象,即可实现单例模式。

  • 相关阅读:
    Nop中的Cache浅析
    使用DapperExtensions实现简单仓储
    使用nodejs爬取拉勾苏州和上海的.NET职位信息
    使用Microsoft Fakes进行单元测试(2)
    使用Microsoft Fakes进行单元测试(1)
    小程序之滚动到页面底部
    小程序之动态修改页面标题
    小程序之面试题
    小程序之公共组件的开发
    小程序之web-view打开外部链接
  • 原文地址:https://www.cnblogs.com/yanlin-10/p/9583134.html
Copyright © 2020-2023  润新知