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中封装GObject模块进行图形化程序编程的教程
Apr 14 Python
python基于Tkinter库实现简单文本编辑器实例
May 05 Python
python如何获取服务器硬件信息
May 11 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
git进行版本控制心得详谈
Dec 10 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
python版百度语音识别功能
Jul 09 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 Python
用python批量下载apk
Dec 29 Python
python在协程中增加任务实例操作
Feb 28 Python
Python基础之hashlib模块详解
May 06 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中extract()函数的妙用分析
2012/07/11 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
JS实现商品倒计时实现代码
2013/05/03 Javascript
Extjs407 getValue()和getRawValue()区别介绍
2013/05/21 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
javascript实现右下角广告框效果
2017/02/01 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
简单介绍Python中的RSS处理
2015/04/13 Python
python实现将文本转换成语音的方法
2015/05/28 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
基于python历史天气采集的分析
2019/02/14 Python
Python实现多进程的四种方式
2019/02/22 Python
Python实现的微信支付方式总结【三种方式】
2019/04/13 Python
NumPy 数组使用大全
2019/04/25 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
Python预测2020高考分数和录取情况
2020/07/08 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
一款纯css3实现的非常实用的鼠标悬停特效演示
2014/11/05 HTML / CSS
全球性的女装店:storets
2019/06/12 全球购物
拾金不昧表扬信范文
2014/01/11 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
2016教师国培研修感言
2015/12/08 职场文书