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小技巧之批量抓取美女图片
Jun 06 Python
在Python中使用base64模块处理字符编码的教程
Apr 28 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 Python
python图片验证码生成代码
Jul 02 Python
关于python的list相关知识(推荐)
Aug 30 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
Python爬虫框架Scrapy常用命令总结
Jul 26 Python
Python标准库shutil用法实例详解
Aug 13 Python
python3.6根据m3u8下载mp4视频
Jun 17 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
python新式类和经典类的区别实例分析
Mar 23 Python
Django程序的优化技巧
Apr 29 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中利用post传递字符串重定向的实现代码
2011/04/21 PHP
php中的静态变量的基本用法
2014/03/20 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
vue element ui validate 主动触发错误提示操作
2020/09/21 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
Mac 上切换Python多版本
2017/06/17 Python
python 以16进制打印输出的方法
2018/07/09 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
python 表格打印代码实例解析
2019/10/12 Python
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
动物学专业毕业生求职信
2013/10/11 职场文书
销售实习自我鉴定
2013/12/07 职场文书
11月红领巾广播稿
2014/01/17 职场文书
教师四风问题整改措施
2014/09/25 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
春节慰问简报
2015/07/21 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
服务行业标语口号
2015/12/26 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS
Python OpenCV超详细讲解基本功能
2022/04/02 Python