Django Admin 组件原理与单例模式深度解析
本文深入解析 Django Admin 组件的底层工作原理,涵盖从项目初始化到路由注册的完整流程。重点剖析 AdminSite 类的单例模式实现机制,包括模块级、装饰器及 __new__ 方法等多种 Python 单例实现方式,帮助开发者理解 Django 后台管理的核心架构。
关于 admin 组件
Django Admin 组件概述
(1) Admin 概述
Admin 是 Django 框架内置的子应用组件。在创建新项目时,它会自动注册到 settings 文件的 INSTALLED_APPS 配置列表中,同时在 urls.py 文件中也会自动生成对应的 admin 路由配置。
Admin 初始化与路由注册
INSTALLED_APPS = [
#自带并且注册的一个组件即app
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
urlpatterns = [
# 自动存在的admin路由
url(r'^admin/', admin.site.urls),
url(r'^stark/', site.urls),
]
Admin 执行流程与模块自动发现
(2) Admin 的执行流程
当 Django 程序启动加载时,系统会自动遍历所有已注册的 APP,查找并执行其中的 admin.py 文件内容。
#在admin.py文件中有一个__init__文件 ,其中有代码如下
#意思是:程序的启动自动寻找名为admin的py文件,然后执行
def autodiscover():
autodiscover_modules('admin', register_to=site)
#具体的方法如下:
def autodiscover_modules(*args, **kwargs):
"""
Auto-discover INSTALLED_APPS modules and fail silently when
not present. This forces an import on them to register any admin bits they
may want.
You may provide a register_to keyword parameter as a way to access a
registry. This register_to object must have a _registry instance variable
to access it.
"""
这一过程主要执行 admin.py 文件中定义的业务逻辑。
# 在django启动时候,系统自动加载
from django.contrib import admin
#导入该APP下的models
from DRF import models
#此处是一个单例模式 admion.site
admin.site.register(models.Publisher)
AdminSite 单例模式机制
在此环节中,应用了单例模式中的 site 对象。AdminSite 类采用单例设计,确保每个 APP 中调用的 admin.site 实际上指向同一个实例对象。
# AdminSite 类
class AdminSite(object):
...
def __init__(self, name='admin'):
self._registry = {} # model_class class -> admin_class instance
self.name = name
self._actions = {'delete_selected': actions.delete_selected}
self._global_actions = self._actions.copy()
all_sites.add(self)
....
site = AdminSite()
随后执行 register 方法,将模型注册到后台管理界面。
# AdminSite中的register 方法
def register(self, model_or_iterable, admin_class=None, **options):
"""
Registers the given model(s) with the given admin class.
The model(s) should be Model classes, not instances.
If an admin class isn't given, it will use ModelAdmin (the default
admin options). If keyword arguments are given -- e.g., list_display --
they'll be applied as options to the admin class.
If a model is already registered, this will raise AlreadyRegistered.
If a model is abstract, this will raise ImproperlyConfigured.
"""
Python 单例模式实现详解
知识补充:单例模式
a.py
class AdminSite(object):
def __init__(self):
self._registry = {}
obj1 = AdminSite()
b.py
import a
a.obj1._registry['k2'] = 666
c.py
import a
a.obj1._registry['k1'] = 123
print(a.obj1._registry)
单例模式的常见实现方法
1:使用模块
Python 的模块机制天然支持单例模式。
因为模块在首次导入时会生成 .pyc 编译文件,后续再次导入时直接加载 .pyc 文件,而不会重新执行模块代码。
因此,只需将相关函数和数据定义在一个模块中,导入该模块即可获得一个单例对象。
例如:
class V1(object):
def foo(self)
pass
V1 = V1()
将上述代码保存为 test.py 文件,使用时直接在其他文件中导入此文件中的对象,该对象即为单例模式的实例。
如:from a import V1
2:使用装饰器
def Singleton(cls):
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
@Singleton
class A(object):
a = 1
def __init__(self, x=0):
self.x = x
a1 = A(2)
a2 = A(3)
3:使用类
4:基于 __new__ 方法实现
在实例化对象时,首先执行类的 __new__ 方法。
即使未显式编写 __new__,默认也会调用 object.__new__ 来实例化对象;随后执行类的 __init__ 方法进行初始化。利用这一机制,可以实现单例模式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













