admin 组件

  Django 自带的用户后台组件

  用于用户便携的操作

admin 组件核心

  • 启动
  • 注册
  • 设计url

启动核心代码

  每个app 通过 apps.py 扫描 admin.py 文件 并执行

"""
setting.py setting.py 中会对注册的 app 自动加载各自里面的 AppxxConfig 模块
"""
INSTALLED_APPS = [
...
'app01.apps.App01Config',
'app02.apps.App02Config',
]
"""
apps.py app下的里面的 adminConfig 在自动执行的时候可以进行启动操作
"""
from django.apps import AppConfig
class App01Config(AppConfig):
name = 'app01'
"""
admin 源码 调用每个app 下的admin.py 文件进行执行
"""
import admin
# 执行每一个app下的admin.py文件
autodiscover_modules('admin', register_to=site)
"""
admin.py 被执行的 admin.py 文件
"""
from django.contrib import admin
from rbac.models import *
# Register your models here.

注册核心代码

  在admin.py 文件中对表进行注册

  注册后的表要判断是否有自定义的配置文件

  若没有则使用默认的 Modeladmin

"""
admin 注册流程核心源码
"""
class AdminSite(object):
def __init__(self,name="admin"):
# 定义一个空字典用于保存注册
self._registry={} # 注册函数
# 需要有两个参数, 被注册的表 以及 是否有自定义的配置操作
def register(self, model, admin_class=None, **options):
# 首先对是否存在自定义配置操作进行判断
if not admin_class:
# 如果无自定义则用默认的
admin_class = Modeladmin
# 有自己的就用自己的
# 注意这里的键为类名而不是字符串
self._registry[model] = admin_class(model, self)
# {Book:ModelAdmin(Book),Publi sh:ModelAdmin(Publish)} # 进行实例化实现单例模式
# 其他所有的程序中的 admin 通过引入,用的都是这个对象
site=AdminSite()
"""
admin.py 中对表进行注册操作
"""
from django.contrib import admin
from rbac.models import *
# Register your models here. # 基于模块的单例模式从而实现所有的注册表都使用的同一个 admin.site 对象
admin.site.register(User)
admin.site.register(Role)
admin.site.register(Permission)

URL 分发核心代码

  调用 urls() 方法

  然后继续调用 get_urls() 方法

     遍历所有注册表,进行URL 的拼接合成最后生成一个列表返回给 urls.py

  最终在urls.py 进行调用

"""
urls.py urls.py 中全部写成了一条
所有的结果都在调用 urls方法后拿到
"""
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
"""
admin 设计url 核心 """
class AdminSite(object):
def get_urls(self): urlpatterns = [
url(r'^$', wrap(self.index), name='index'),
url(r'^login/$', self.login, name='login'),
url(r'^logout/$', wrap(self.logout), name='logout'),
url(r'^password_change/$', wrap(self.password_change, cacheable=True), name='password_change'),
url(r'^password_change/done/$', wrap(self.password_change_done, cacheable=True),
name='password_change_done'),
url(r'^jsi18n/$', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$', wrap(contenttype_views.shortcut),
name='view_on_site'),
]
valid_app_labels = [] # 遍历注册过的表,对每个表生成 相应的 url 进行链接起来
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) if valid_app_labels:
regex = r'^(?P<app_label>' + '|'.join(valid_app_labels) + ')/$'
urlpatterns += [
url(regex, wrap(self.app_index), name='app_list'),
]
# 返回给urls 得出的 urls列表
# 所有的urls 保存在 urlpatterns列表里面
return urlpatterns # 调用 get_urls 获得全部的结果
def urls(self):
# 给urls.py 返回回去
return self.get_urls(), 'admin', self.name 

ps:

  url 的设计和分发合成是什么时候完成?

  答案:

    在项目启动的时候就完成

    在表进行注册后,就已经生成了,而不是url来了再生成

    本质上 django 启动就已经是启动了文件,不然你的admin 单例从何而来

模拟完成一个 Xadmin 组件实现 admin 组件的功能

"""
自己实现一个 Xadmin 模块来替换掉 admin   和 admin 一样需要
  启动
  注册
  url 分发
""" """
启动
"""
# setting.py
INSTALLED_APPS = [
...
'Xadmin.apps.XadminConfig',
'app01.apps.App01Config',
'app02.apps.App02Config',
] # apps.py
from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules # Xadmin.py
class XadminConfig(AppConfig):
name = 'Xadmin'
"""
启动
"""
def ready(self):
autodiscover_modules('Xadmin') class ModelXadmin(object):
def __init__(self,model,site): self.model=model
self.site=site """
url 分发
二级分发和视图函数放在 配置类里面
不放在 注册类里面的原因:
因为注册类 单例生成 导致所有的注册表的self里面无法区分出来彼此的 配置类
如果放在 配置类中 self 就是注册表自己对应的 配置类 根本拿不到想要的数据(比如 表 本身)
比如 在 配置类 中 self.model 就是那个表,(在init 中注册的都可以随便拿来用了)
"""
def list_view(self, request):
print("self.model",self.model) data_list=self.model.objects.all()
print("data_list",data_list)
return render(request, 'list_view.html',{"data_list":data_list}) def add_view(self, request):
return render(request, 'add_view.html') def change_view(self, request, id):
return render(request, 'change_view.html') def delete_view(self, request, id):
return render(request, 'delete_view.html') def get_urls2(self):
temp = []
temp.append(url(r"^$", self.list_view))
temp.append(url(r"^add/$", self.add_view))
temp.append(url(r"^(\d+)/change/$", self.change_view))
temp.append(url(r"^(\d+)/delete/$", self.delete_view))
return temp @property
def urls2(self):
return self.get_urls2(), None, None class XadminSite(object):
def __init__(self,name="admin"):
self._registry={}
"""
注册
"""
def register(self, model, admin_class=None, **options):
if not admin_class:
admin_class = Modeladmin
self._registry[model] = admin_class(model, self) """
url 分发
"""
def get_urls(self):
temp = []
for model, admin_class_obj in self._registry.items():
app_name = model._meta.app_label
model_name = model._meta.model_name
temp.append(url(r'^{0}/{1}/'.format(app_name, model_name), admin_class_obj.urls2), )
return temp @property
def urls(self):
return self.get_urls(),None,None site=XadminSite()

# url.py
from Xadmin.service.Xadmin import site
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Xadmin/', site.urls),
] """
其他的程序使用方式   和以往admin的方式基本一致
""" """
启动
"""
# setting.py
INSTALLED_APPS = [
...
'app01.apps.App01Config',
"app02.apps.App02Config"
] # apps.py
from django.apps import AppConfig
class App01Config(AppConfig):
name = 'app01' # Xadmin.py
from Xadmin.service.Xadmin import site, ModelXadmin """
注册
"""
site.register(Book, BookConfig)

Django admin组件源码流程的更多相关文章

  1. rest_framework解析器组件源码流程

    rest_framework解析器组件源码流程 解析器顾名思义就是对请求体进行解析.为什么要有解析器?原因很简单,当后台和前端进行交互的时候数据类型不一定都是表单数据或者json,当然也有其他类型的数 ...

  2. Django rest_framework 认证源码流程

    一.请求到来后,都要先执行dispatch方法 dispatch根据请求方式的不同触发get/post/put/delete等方法 注意,APIView中的dispatch方法有很多的功能 def d ...

  3. django-admin的源码流程

    一.admin的源码流程 首先可以确定的是:路由关系一定对应一个视图函数 a.当点击运行的时候,会先找到每一个app中的admin.py文件,并执行 b.执行urls.py admin.site是什么 ...

  4. Django Rest Framework框架源码流程

    在详细说django-rest-framework源码流程之前,先要知道什么是RESTFUL.REST API . RESTFUL是所有Web应用都应该遵守的架构设计指导原则. REST是Repres ...

  5. Django REST framework —— 认证组件源码分析

    我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...

  6. Django drf:序列化增删改查、局部与全局钩子源码流程、认证源码分析、执行流程

    一.序列化类的增.删.改.查 用drf的序列化组件   -定义一个类继承class BookSerializer(serializers.Serializer):   -写字段,如果不指定source ...

  7. Django session 源码流程

    流程 Django session源码流程 首先执行的是SessionMiddleware的init方法 import_module(settings.SESSION_ENGINE) 导入了一个 dj ...

  8. Django REST framework —— 权限组件源码分析

    在上一篇文章中我们已经分析了认证组件源码,我们再来看看权限组件的源码,权限组件相对容易,因为只需要返回True 和False即可 代码 class ShoppingCarView(ViewSetMix ...

  9. Django 之restfromwork 源码分析以及使用之--视图组件

    restframework 源码分析以及使用 mixins 中的五种类方法 from rest_framework import mixins # mixins 中一种有五种类 # 第一种:用户保存数 ...

随机推荐

  1. Net中获取程序集路径

      从内存中加载的程序集,无路径   IIS中路径 protected void Page_Load(object sender, EventArgs e) { Response.Write(&quo ...

  2. Django的urls.py加载静态资源图片,TypeError: view must be a callable or a list/tuple in the case of include().

    Django的urls.py加载静态资源图片,TypeError: view must be a callable or a list/tuple in the case of include(). ...

  3. Android入门第一课之Java基础

    通知:由于本周六场地申请没通过,所以本周的培训临时取消. 今天给大家带来的是Android入门的第一课,由于教室申请的不确定性,因此,每次培训的内容都会在博客先提前释放出来.首先Android的APP ...

  4. redis的几种数据导入导出方式【转】

    环境说明:202.102.221.11 redis源实例202.102.221.12 redis目标实例202.102.221.13 任意linux系统 一.redis-dump方式 1.安装redi ...

  5. 关于使用阿里OSS服务搭建图床和使用PicGO上传图片到图床

    最近喜欢上了使用markdown来写博客,可是markdown的图片却是本地的,如果我要发博客,那么又要重复截图了.于是干脆弄了个图床,本地截图的时候上传到图床,markdown中的代码结果也是图床里 ...

  6. Vue一个案例引发「内容分发slot」的最全总结

    今天我们继续来说说 Vue,目前一直在自学 Vue 然后也开始做一个项目实战,我一直认为在实战中去发现问题然后解决问题的学习方式是最好的,所以我在学习一些 Vue 的理论之后,就开始自己利用业余时间做 ...

  7. C# 第十版

    地址: https://files.cnblogs.com/files/blogs2014/%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%28%E7%AC%AC11%E7% ...

  8. mssql sqlserver获取指定月份当月天数总和

    摘要: 下文通过sql函数的形式,获取指定月份的总天数 实验环境:sqlserver 2008 R2 制作思路: 1. 获取指定月份的第一天, 2. 并采用dateadd向后加一个月形成一个新的日期 ...

  9. SQL根据细粒度为天的查询

    当我们集成了一些前端框架,在某些展示页面上往往具有某些查询条件.而这其中日期查询的处理又较为麻烦,此处,我罗列了一种当前台上传了一种默认的date格式的日期查询数据至后台未经Controller或Se ...

  10. Chinese word segment based on character representation learning 论文笔记

    论文名和编号 摘要/引言 相关背景和工作 论文方法/模型 实验(数据集)及 分析(一些具体数据) 未来工作/不足 是否有源码 问题 原因 解决思路 优势 基于表示学习的中文分词 编号:1001-908 ...