一. 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)), ]