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 相关文章推荐
wxPython事件驱动实例详解
Sep 28 Python
Python实现国外赌场热门游戏Craps(双骰子)
Mar 31 Python
python获取一组汉字拼音首字母的方法
Jul 01 Python
Python3 Random模块代码详解
Dec 04 Python
python使用Tesseract库识别验证
Mar 21 Python
Python使用pyshp库读取shapefile信息的方法
Dec 29 Python
python实现顺时针打印矩阵
Mar 02 Python
python ubplot使用方法解析
Jan 10 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
python读取当前目录下的CSV文件数据
Mar 11 Python
后端开发使用pycharm的技巧(推荐)
Mar 27 Python
pytorch 中autograd.grad()函数的用法说明
May 12 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抽象工厂模式(Elgg)
2010/03/21 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
JS 有名函数表达式全面解析
2010/03/19 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
浅谈 vue 中的 watcher
2017/12/04 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
python getpass实现密文实例详解
2019/09/24 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
Python基于locals返回作用域字典
2020/10/17 Python
如何通过python实现IOU计算代码实例
2020/11/02 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
2020/11/20 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
编辑个人求职信范文
2013/09/21 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
党风廉正建设责任书
2015/01/29 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
物业保安辞职信
2015/05/12 职场文书
大学生读书笔记大全
2015/07/01 职场文书
安全生产会议制度
2015/08/06 职场文书
少儿励志名言(80句)
2019/08/14 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技