单例模式和配置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",)
jerd=Person("jerd",)
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=
obj1=Myclass()
obj2=Myclass()
print(obj1,id(obj1)) #<__main__.Myclass object at 0x000001A786801048>
print(obj2,id(obj2)) #<__main__.Myclass object at 0x000001A786801048>
实例化时先执行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)) #
print(id(mn2)) #
print(id(ms1)) #
print(id(ms2)) #
##在第一次执行时,先加载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=)
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=)
addr=models.CharField(max_length=)
def __str__(self):
return title
class Userinfo(models.Model):
name=models.CharField(max_length=)
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属性,会把标签显示出来
#.自定义admin显示的字段。多对多的字段不能加,否则报错
# list_display = ["title","price","publisher",]
#.指定特定字段进入编辑
list_display_links = ["title","price"]
#.在admin中添加新字段,在类中定义一个方法,返回响应字段
list_display = ["title", "price", "publisher",deletes ]
#.根据字段进行分类,在页面右侧出现filter区
list_filter=["price","title","authors","publisher"]
#.搜素框,根据定义的字段进行搜素,模糊查找
search_fields = ["title", "price"]
#.更改页面
# change_list_template="list.html" 基本不用
#.在编辑时,只能对定义的字段编辑
# fields = ('title',)
#.批处理
def patch_init(self,request,queryset):
queryset.update(price=) #对价格进行更改
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显示中文

#.将Django自身内容设置为中文
在setting.py中修改LANGUAGE_CODE ='zh-hans'
#.给创建的表名和字段起别名(中文显示),在models中给表加verbose_name属性
class Book(models.Model):
title=models.CharField(max_length= ,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 # 设置为复数形式

单例模式和配置admin的更多相关文章

  1. 1 - django-介绍-MTV-命令-基础配置-admin

    目录 1 什么是web框架 2 WSGI 3 MVC与MTV模式 3.1 MVC框架 3.2 MTV框架 3.3 区别 4 django介绍 4.1 Django处理顺序 4.2 创建django站点 ...

  2. 配置 admin 页面

    创建 blog 的管理后台 首先是 blog 这个 App,其中定义了 3个 Model,分别是 Category.Post 和 Tag.先创建 admin 页面,其代码需要写到 blog/admin ...

  3. Django学习(四)---Admin配置

    1)Admin: admin是django自带的功能强大的自动化数据管理界面 被授权的用户可以直接在Admin中管理数据库(增.删.改.查) Django提供了许多针对Admin的定制功能 2)配置A ...

  4. 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

  5. 万里长征第二步——django个人博客(第五步 ——配置后台admin)

    在urls.py文件中配置admin路径 from django.conf.urls import url from django.contrib import admin from blog.vie ...

  6. 四 Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

  7. django-3 admin开启后台配置并展示表内容

    设置了superuser 之后,可以在run server 后, 通过浏览器访问后台,进行界面配置. 1. python manage.py creatersuperuser 此命令在manage.p ...

  8. 002-Django数据库及后台admin配置

    连接mysql数据库 数据库准备 如果连接本机数据库,mysql安装及配置可参考https://www.cnblogs.com/feizisy/p/11882521.html 如果连接阿里云RDS,需 ...

  9. Django的admin.py注册流程

    通常创建一个Django项目的时候,在Django的配置文件settings.py中,都会有下面的这段配置: INSTALLED_APPS = [ 'django.contrib.admin', 'd ...

随机推荐

  1. Starting php-fpm [18-Jun-2019 12:56:59] NOTICE: PHP message: PHP Warning: Version warning提示报错解决

    php-fpm在命令行重启时出现如下提示信息在终端上,虽然不影响使用,但是不够干净利落,参考了一篇国外博客得以解决,参考链接:https://community.centminmod.com/thre ...

  2. 一劳永逸的解决AFNetworking3.0网络请求问题

    AFNetworking在iOS网络请求第三方库中占据着半壁江山,前段时间将AFNetworking进行了3.0版本的迁移,运用面向对象的设计将代码进行封装整合,这篇文章主要为还在寻找AFNetwor ...

  3. 浅谈在ES5环境下实现const

    最近看到一个面试题--用ES5实现const.作为JS初学者的笔者知道在ES6中有const命令,可以用来声明常量,一旦声明,常量的值就不可改变.例如: 1234567891011 const Pi ...

  4. 基于webhook方案的Git自动部署方案

    之前已经用Git实现了自己博客的提交自动部署,并自动提交到GitHub和coding以备不时之需.平时项目代码都托管在Coding或者GitHub上,也已经用上了coding提供的webhook功能, ...

  5. Circles of Waiting

    题目传送门 很容易列出期望的方程,高斯消元搞一波但是常规消元复杂度是$O(r^6)$的考虑从左到右从上到下编号然后按编号从小到大消元假设黄点是已经消元的点,那么消下一个点的时候,只有绿点的方程中该项系 ...

  6. CSS中网格布局实战(初级)

    大家好,网格布局是我们在网页布局中经常用到的,那这里我就给大家分享一篇简单的网格布局,让大家能简单明了的了解网格布局的基本内容.闲话不多说,直接进入主题! 第一步,基本的框架结构.这里直接一个div来 ...

  7. Grafana+Prometheus监控mysql性能

    #cmd /usr/local 今天讲一下如何监控服务器中的mysql数据库的性能 一.数据库操作 1.mysql启动 #service mysqld start #启动数据库 #service my ...

  8. 关于HTTP那些事

    写这篇文章的原因 记录前端性能优化用到的关键概念 简化大家对HTTP的学习 大家或许面试的时候可以用得到哦 HTTP是什么 Web的应用层协议(超文本传输协议HyperText Transfer Pr ...

  9. [面试专题]Web缓存详解

    Web缓存详解 标签(空格分隔): 缓存 缓存之于性能优化 请求更快:通过将内容缓存在本地浏览器或距离最近的缓存服务器(如CDN),在不影响网站交互的前提下可以大大加快网站加载速度. 降低服务器压力: ...

  10. GZOJ 1361. 国王游戏【NOIP2012提高组DAY1】

    国王游戏[NOIP2012提高组DAY1] Time Limit:1000MS Memory Limit:128000K Description 国王游戏(game.cpp/c/pas) [问题描述] ...