Django stark组件使用及原理详解


Posted in Python onAugust 22, 2019

 stark组件是仿照django的admin模块开发的一套组件,它的作用是在网页上对注册的数据表进行增删改查操作

一、配置

1、创建stark应用,在settings.py中注册stark应用

stark APP专门用于存放自定义组件的核心代码。

manage.py@stark_demo > startapp stark

在settings.py文件注册stark:

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'app01.apps.App01Config',
  'stark.apps.StarkConfig',
]

2、项目启动加载每一个app下的所有stark文件

在stark项目的apps.py文件加上下面的代码,ready函数的作用是让Django在启动时自动扫描每一个app下面的stark.py文件

from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules 
class StarkConfig(AppConfig):
  name = 'stark'   
  # 程序启动时,扫描app下得指定文件(stark.py)并执行
  def ready(self):
    autodiscover_modules('stark')

3、app01/models.py中创建模型

class UserInfo(models.Model):
  name=models.CharField(max_length=32)
  age=models.IntegerField() 
  def __str__(self):
    return self.name 
class Book(models.Model):
  title=models.CharField(max_length=32) 
  def __str__(self):
    return self.title

执行数据迁移和创建超级用户操作:

makemigrations
migrate 
createsuperuser (yuan yuan1234)

4、admin.py配置

from django.contrib import admin
# Register your models here.
from .models import *
class UserAdmin(admin.ModelAdmin):
  list_display = ["pk",'name','age']
  list_filter = ['name','age'] 
  # 定制action具体方法
  def func(self,request,queryset):
    queryset.update(age=44)
   func.short_description = "批量初始化操作"
  actions = [func] 
admin.site.register(UserInfo, UserAdmin)
admin.site.register(Book)

5、程序运行显示效果 

Django stark组件使用及原理详解

二、stark组件开发

1、首先创建一个Python包,创建一个stark.py文件

Django stark组件使用及原理详解

2、stark/service/stark.py(单例)

class ModelStark(object):
  list_display=[] 
  def __init__(self,model,site):
    self.model=model
    self.site=site 
class StarkSite(object):
  def __init__(self):
    self._registry = {} 
  def register(self, model, stark_class=None, **options):
    if not stark_class:
      # 如果注册的时候没有自定义配置类,执行
      stark_class = ModelStark  # 配置类
 
    # 将配置类对象加到_registry字典中,键为模型类
    self._registry[model] = stark_class(model, self)  # _registry={'model':stark_class(model)}
site = StarkSite()

(1)在使用admin组件的时候,是在我们注册时候调用一个单例对象site进行注册。stark中同样生成了一个site单例对象。然后在app01的stark文件导入:

from stark.service.stark import site

这样就通过使用python模块的方式实现了单例模式。

(2)通过单例对象site调用注册方法,所以需要在StarkSite类创建一个register方法。

3、app01/stark.py

from app01 import models
from stark.service.stark import site, ModelStark
# 自定义配置类
class UserConfig(ModelStark):
  pass 
site.register(models.UserInfo, UserConfig)
site.register(models.Book) 
print("_registry", site._registry)

注册之后,启动项目就会将我们注册的模型类添加到字典_registry中.

三、设计url

1、编写urls.py并查看admin的url源码

Django项目建起来之后就会自动创建一个url文件,如:其中admin的url就已经配置好了

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from stark.service.stark import site
urlpatterns = [
  path('admin/', admin.site.urls),
  # path('stark/', site.urls),
  url(r'^stark/', site.urls),
]

查看admin.site.urls源码,发现urls方法有property装饰器:

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

urls方法有property装饰器,会将函数装饰成一个属性,它会在项目的启动的时候就执行,将内部的url进行分发,生成url的方法就是get_urls()。

return三个值以元组的形式返回 ([], None, None )。

2、自定义url(stark/service/stark.py)

from django.conf.urls import url
from django.shortcuts import HttpResponse,render 
class ModelStark(object):
  """定制配置类"""
  list_display = []
 
  def __init__(self, model, site):
    self.model = model
    self.site = site
 
  def add(self, request):
    return HttpResponse("add")
 
  def delete(self, request, id):
    return HttpResponse("delete")
 
  def change(self, request, id):
    return HttpResponse("change")
 
  def list_view(self, request):
    return HttpResponse("list_view")
 
  def get_urls_2(self):
    temp = []
    temp.append(url(r"^add/", self.add))
    temp.append(url(r"^(\d+)/delete/", self.delete))
    temp.append(url(r"^(\d+)/change/", self.change))
    temp.append(url(r"^$", self.list_view))
    return temp
 
  @property
  def urls_2(self):
    return self.get_urls_2(), None, None # [], None, None
 
class StarkSite(object):
  """site单例类"""
  def __init__(self):
    self._registry = {}
 
  def register(self, model, stark_class=None, **options):
    """注册"""
    if not stark_class:
      # 如果注册的时候没有自定义配置类,执行
      stark_class = ModelStark  # 配置类
 
    # 将配置类对象加到_registry字典中,键为模型类
    self._registry[model] = stark_class(model, self)  # _registry={'model':admin_class(model)}
 
  def get_urls(self):
    """构造一层url"""
    temp = []
    for model, stark_class_obj in self._registry.items():
      # model:一个模型表
      # stark_class_obj:当前模型表相应的配置类对象
 
      model_name = model._meta.model_name
      app_label = model._meta.app_label
 
      # 分发增删改查
      temp.append(url(r"^%s/%s/" % (app_label, model_name), stark_class_obj.urls_2))
      """
        path('app01/userinfo/',UserConfig(Userinfo,site).urls2),
        path('app01/book/',ModelStark(Book,site).urls2),
      """
    return temp
 
  @property
  def urls(self):
    return self.get_urls(), None, None
 
site = StarkSite()  # 单例对象

注意:

(1)StarkSite是单例类,site是单例对象,放在里面的变量都是相同的,无法定制任何信息。因此不能把增删改查和get_urls_2等函数都放在StarkSite类中。

(2)用户可以自定制配置页面,所以调用配置类 stark_class_obj.urls_2

# 分发增删改查
temp.append(url(r"^%s/%s/" % (app_label, model_name), stark_class_obj.urls_2))

(3)self._registry拿到所有的注册对象,注意遍历拿到的model和stark_class_obj

def get_urls(self):
  """构造一层url"""
  temp = []
  for model, stark_class_obj in self._registry.items(): 
    # model:一个模型表
    # stark_class_obj:当前模型表相应的配置类对象
    ...

(4)不同的model表,显示不同的url

Django stark组件使用及原理详解

(5)在ModelStark中self.model是什么?

def list_view(self, request):
  print("self.model:", self.model)  # self.model: <class 'app01.models.UserInfo'>
  return render(request, "list_view.html", locals())

self.model是用户当前访问的模型表!!

四、stark路由分发流程

Django stark组件使用及原理详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python client使用http post 到server端的代码
Feb 10 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
Python简单读取json文件功能示例
Nov 30 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
python实现彩票系统
Jun 28 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
Python实现微信消息防撤回功能的实例代码
Apr 29 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
pip安装python库的方法总结
Aug 02 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
在 Python 中接管键盘中断信号的实现方法
Feb 04 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 #Python
Python学习笔记之列表和成员运算符及列表相关方法详解
Aug 22 #Python
Django上线部署之IIS的配置方法
Aug 22 #Python
对python中UDP,socket的使用详解
Aug 22 #Python
python3的url编码和解码,自定义gbk、utf-8的例子
Aug 22 #Python
Python学习笔记之集合的概念和简单使用示例
Aug 22 #Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 #Python
You might like
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
360通用php防护代码(使用操作详解)
2013/06/18 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
php解决约瑟夫环示例
2014/04/09 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
jQuery 获取对象 定位子对象
2010/05/31 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
python实现简易动态时钟
2018/11/19 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
将keras的h5模型转换为tensorflow的pb模型操作
2020/05/25 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
Stubhub英国:购买体育、演唱会和剧院门票
2018/06/10 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
服装设计专业自荐书范文
2013/12/30 职场文书
大学生职业生涯规划书
2014/03/14 职场文书
2014年新生军训方案
2014/05/01 职场文书
语文高效课堂实施方案
2014/05/03 职场文书
党的群众路线查摆剖析材料
2014/10/10 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
追悼会家属答谢词
2015/09/29 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python
使用python求解迷宫问题的三种实现方法
2022/03/17 Python