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 相关文章推荐
pyqt4教程之widget使用示例分享
Mar 07 Python
Python编程实战之Oracle数据库操作示例
Jun 21 Python
使用Python写一个贪吃蛇游戏实例代码
Aug 21 Python
Python 从列表中取值和取索引的方法
Dec 25 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
python统计字符的个数代码实例
Feb 07 Python
python函数定义和调用过程详解
Feb 09 Python
python报错: 'list' object has no attribute 'shape'的解决
Jul 15 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 Python
Python selenium模拟网页点击爬虫交管12123违章数据
May 26 Python
浅谈Python协程asyncio
Jun 20 Python
python实现学生信息管理系统(面向对象)
Jun 05 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
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
php缓冲 output_buffering的使用详解
2013/06/13 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
python 中文乱码问题深入分析
2011/03/13 Python
重命名批处理python脚本
2013/04/05 Python
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
Python获取邮件地址的方法
2015/07/10 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
Python3内置模块random随机方法小结
2019/07/13 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
师范大学应届生求职信
2013/11/21 职场文书
创先争优活动方案
2014/02/12 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
中秋晚会致辞
2015/07/31 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫
Golang获取List列表元素的四种方式
2022/04/20 Golang