一、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")) ]
二、单例模式
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)) # 打印两个对象的内存地址
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中 模块一旦被导入,就不会再导入第二次,之后再执行它,依然是第一次导入的那个文件
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
做数据库迁移(略)
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)
再新建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
数据库迁移(略)
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配置 """
总结:
使用模块创建单例:创建一个模块,里面新建一个类,再实例化这个类,在其他模块中导入这个实例化的对象,即可实现单例模式。