广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Django admin源码剖析
  • 945
分享到

Django admin源码剖析

源码Djangoadmin 2023-01-30 22:01:02 945人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在

单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

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

python 中,我们可以用多种方法来实现单例模式:

  • 使用 __new__()
  • 使用模块
  • 使用装饰器(decorator)
  • 使用元类(metaclass)

1、使用__new__()方式

为了使类只能出现一个实例,我们可以使用 __new__() 来控制实例的创建过程,代码如下:

__new__()方法用来创建实例对象

__init__()方法用来初始化实例对象

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age


class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        print(1)
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

    def __init__(self, name, age):
        print(2)
        self.name = name
        self.age = age


if __name__ == '__main__':
    p1 = Person("djb", 18)
    p2 = Person("djb", 18)

    print(p1 == p2)
    print(id(p1), id(p2))

    print("=" * 120)

    s1 = Singleton("djb", 18)
    s2 = Singleton("djb", 18)
    print(s1 == s2)
    print(id(s1), id(s2))

2、使用模块方式

其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

如果我们真的想要一个单例类,可以考虑这样做:

class Singleton(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age


p1 = Singleton("djb", 18)

使用下面的代码测试一下:

from singleton import p1

print(id(p1))
print(p1.name)
p1.name = "Bob"

from singleton import p1

print(id(p1))
print(p1.name)

剩下那两种自己查资料呗...

admin执行流程

 <1>循环加载执行所有已经注册的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)

<3> admin.site  

 

这里应用的是一个单例模式,对于AdminSite类的一个单例模式,执行的每一个app中的每一个admin.site都是一个对象

<4> 执行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)

到这里,注册结束!

<5> admin的URL配置

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]
class AdminSite(object):
    
     def get_urls(self):
        from Django.conf.urls import url, include
      
        urlpatterns = []

        # Add in each model's views, and create a list of valid URLS for the
        # app_index
        valid_app_labels = []
        for model, model_admin in self._registry.items():
            urlpatterns += [
                url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
            ]
            if model._meta.app_label not in valid_app_labels:
                valid_app_labels.append(model._meta.app_label)

      
        return urlpatterns

    @property
    def urls(self):
        return self.get_urls(), 'admin', self.name

<6>  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'^Xadmin/', ([
                    url(r'^test01/', test01),
                    url(r'^test02/', test02),

                    ],None,None)),

]

 

from django.conf.urls import url,include
from django.contrib import admin

from django.shortcuts import HttpResponse

def change_list_view(request):
    return HttpResponse("change_list_view")
def add_view(request):
    return HttpResponse("add_view")
def delete_view(request):
    return HttpResponse("delete_view")
def change_view(request):
    return HttpResponse("change_view")

def get_urls():

    temp=[
        url(r"^$".fORMat(app_name,model_name),change_list_view),
        url(r"^add/$".format(app_name,model_name),add_view),
        url(r"^\d+/del/$".format(app_name,model_name),delete_view),
        url(r"^\d+/change/$".format(app_name,model_name),change_view),
    ]

    return temp


url_list=[]

for model_class,obj in admin.site._registry.items():

    model_name=model_class._meta.model_name
    app_name=model_class._meta.app_label

    # temp=url(r"{0}/{1}/".format(app_name,model_name),(get_urls(),None,None))
    temp=url(r"{0}/{1}/".format(app_name,model_name),include(get_urls()))
    url_list.append(temp)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^Xadmin/', (url_list,None,None)),
]

扩展优化
扩展优化

 

--结束END--

本文标题: Django admin源码剖析

本文链接: https://www.lsjlt.com/news/179880.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Django admin源码剖析
    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在...
    99+
    2023-01-30
    源码 Django admin
  • Django的admin源码浅析和模仿
    admin模块: admin提供了5种接口 list_display, 指定数据展示字段,不能放多对多字段 list_display_link,哪个字段可以链接   search_fields,搜索框 search_fiekds ...
    99+
    2023-01-31
    源码 Django admin
  • Spring源码剖析9:Spring事务源码剖析
    转自:http://www.linkedkeeper.com/detail/blog.actionbid=1045...
    99+
    2023-06-02
  • 深入剖析JavaReentrantLock的源码
    目录1. ReentrantLock的使用2. ReentrantLock类结构3. ReentrantLock源码解析3.1 ReentrantLock构造方法3.2 非公平锁源码...
    99+
    2022-11-21
    Java ReentrantLock源码 Java ReentrantLock
  • python源码剖析之PyObject详解
    目录一、Python中的对象1.1 对象机制的基石PyObject二、类型对象2.1 对象的创建2.2 对象的行为2.3 类型的类型三、Python的多态性四、引用计数五、Pytho...
    99+
    2022-11-12
  • django源码分析 LazySetti
    一、django中通过LazySetting对象来获取项目的配置,LazySetting对象有什么特性?为什么使用这个对象? LazySetting顾名思义,就是延迟获取配置内容。比如,我们定义了一个对象A,并对其添加了一些属性,对A初始...
    99+
    2023-01-31
    源码 django LazySetti
  • 源码剖析Android中Okio的使用
    目录okio库的类结构okio 主要的接口和类okio接口和类的说明okio读取文件Okio.source 方法Okio.buffer 方法readUtf8() 方法总结Okio双流...
    99+
    2023-02-17
    Android Okio使用 Android Okio
  • 浅析Alibaba Nacos注册中心源码剖析
    目录Nacos&Ribbon&Feign核心微服务架构图架构原理Nacos架构图Nacos核心功能点Nacos核心功能源码架构图Nacos服务注册表结构:MapNac...
    99+
    2022-11-12
  • python源码剖析之PyObject的示例分析
    这篇文章主要介绍python源码剖析之PyObject的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、Python中的对象Python中一切皆是对象。————Guido van Rossum(1989)这...
    99+
    2023-06-15
  • django源码分析 python ma
    django是一个快速开发web应用的框架, 笔者也在django框架上开发不少web应用,闲来无事,就想探究一下django底层到底是如何实现的,本文记录了笔者对django源码的分析过程 I believe to become a ...
    99+
    2023-01-31
    源码 django ma
  • Hadoop源码分析三启动及脚本剖析
    目录1、 启动2、 脚本分析start-all.sh脚本内容如下:start-dfs.sh的内容如下:启动上述角色调用的hadoop-daemons.sh脚本内容如下:我们继续看ha...
    99+
    2022-11-12
  • Hadoop源码分析五hdfs架构原理剖析
    目录1、 hdfs架构如果在hadoop配置时写的配置文件不同,启动的服务也有所区别namenode的下方是三台datanode。namenode左右两边的是两个zkfc。namen...
    99+
    2022-11-12
  • 如何剖析Python if语句源代码
    如何剖析Python if语句源代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python if语句在Python编程语言环境中有很多应用的地方,不少的程序员都不能够很顺利...
    99+
    2023-06-17
  • Go defer 原理和源码剖析(推荐)
    目录1. 编译器编译 defer 过程2. defer 传递参数3. 执行多条 defer4. defer 和 return 运行顺序Go 语言中有一个非常有用的保留字 defer,...
    99+
    2022-11-12
  • 从源码剖析Android中的Intent组件
    我们知道,Intent主要用来激活安卓几大组件,那么它具体是怎样来激活的?激活时是否可以携带java对象?为何要将对象序列化后才能传递? 一、Intent官网解释 Intent...
    99+
    2022-06-06
    intent 源码 Android
  • C++11 shared_ptr 与 make_shared源码剖析详解
    目录0. 前言1. 源码分析1.1 头文件1.2 构造1.2.1 shared_ptr 的移动构造函数1.2.2 shared_ptr 的拷贝构造函数1.3 赋值重载1.4...
    99+
    2022-11-12
  • RocketMQ消息发送流程源码剖析
    目录正文读源码1 调用defaultMQProducerImpl.send()2 设置过期时间3 执行defaultMQProducerImpl.sendDefaultImpl()方...
    99+
    2022-11-13
    RocketMQ消息发送流程 RocketMQ 消息
  • vue3源码剖析之简单实现方法
    目录前言🍹准备工作🍲vue3用法🍖实现总结前言 最近,由于我的第一个vue3 + ts的正式项目,已经进入验收阶段。听你们老说vue3...
    99+
    2022-11-12
  • Flask核心机制--上下文源码剖析
    一、前言   了解过flask的python开发者想必都知道flask中核心机制莫过于上下文管理,当然学习flask如果不了解其中的处理流程,可能在很多问题上不能得到解决,当然我在写本篇文章之前也看到了很多博文有关于对flask上下文管理...
    99+
    2023-01-30
    上下文 源码 机制
  • Linux内核网络协议栈源码剖析
    Linux内核网络协议栈是一个非常庞大和复杂的软件系统,涉及到很多不同的模块和功能。以下是一个大致的剖析步骤:1. 网络协议栈的初始...
    99+
    2023-09-23
    Linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作