s111 stark组件


内容回顾:
1. 类当做key
2. django中的model所在app名称、以及小写类名。

    def index(request):
        # print(m1.UserInfo,m1.UserInfo._meta.app_label,m1.UserInfo._meta.model_name)
        # print(m2.Role,m2.Role._meta.app_label,m2.Role._meta.model_name)
        # 获取当前models类所在app名称、以及小写类名。
        _registry = {
            m1.UserInfo:'1',
            m2.Role:'2',
        }
         for k,v in _registry.items():
             print(k._meta.app_label,k._meta.model_name)
                   所在app名称         模块名(类名)
        return HttpResponse('...')

app01 userinfo
app02 role


今日内容:
1. stark介绍
     快速完成对N张表增删改查+自定义复杂操作。
    
2. 单例模式

3. 路由系统

4. 启动后、路由加载前定制一段代码。

5. 参考django admin源码编写组件。


内容详细:
1. stark介绍
     快速完成对N张表增删改查+自定义复杂操作。

2. 单例模式
     这么写:
         stark.py
             class Adminstark(object):
                 pass
             site = Adminstark()   
     调用实例:
         import stark
         stark.site
         stark.site

单例模式/lewen.py
class AdminSite(object):

    def __init__(self):
        self._registry = {}

obj1 = AdminSite()


2.单例模式/lemi.py

import lewen
lewen.obj1._registry['k2'] = 666
print(lewen.obj1)


2.单例模式/kevin.py
import lewen

lewen.obj1._registry['k1'] = 123
import lemi

print(lewen.obj1)
print(lewen.obj1._registry)

虽然导入了两次,但内存地址一样
# <lewen.AdminSite object at 0x0000026419BB7A58>
# <lewen.AdminSite object at 0x0000026419BB7A58>
# {'k1': 123, 'k2': 666}
单例模式

任何去导入lewen模块的就会执行, obj1 = AdminSite()

因为单列模式是所有调用的共用一个对象,如果每次调用,经构造方法绑定的值不做存储,那么会后面调用模块设置的值覆盖掉。

可以在单列模式内部用一个静态字段存储每次的不同调用设置的值。

3. 路由系统
     - include
     - namespace

    - 补充:
        项目/urls.py
            from django.conf.urls import url,include
             from django.contrib import admin
             from app01 import views



            urlpatterns = [
                 url(r'^admin/', admin.stark.urls),
                 url(r'^rbac/', ([
                                     url(r'^login/', views.login),
                                     url(r'^logout/', views.logout),
                                     url(r'^x1/', ([
                                                     url(r'^add/', views.add,name='n1'),
                                                     url(r'^change/', views.change,name='n2'),
                                                   ],None,'xxx')),
                                 ],None,'rbac')),
             ]
         app01/views.py
             from django.shortcuts import render
             from django.shortcuts import HttpResponse
             from django.urls import reverse

            def login(request):
                 url1 = reverse('rbac:xxx:n1')
                 url2 = reverse('rbac:xxx:n2')

                print(url1)
                 print(url2)
                 return HttpResponse('login')

            def logout(request):
                 return HttpResponse('logout')

            def add(request):
                 return HttpResponse('add')

            def change(request):
                 return HttpResponse('change')
- 补充:

    

4. 启动后、路由加载前定制一段代码。

     stark/service/stark.py 类似admin功能,提供表的注册
     a. 创建一个stark app 组件
       
     b. 编写ready方法
         stark/app.py
        
         from django.apps import AppConfig
         class StarkConfig(AppConfig):
             name = 'stark'
             def ready(self):
             "Override this method in subclasses to run code when Django starts."
            
                 from django.utils.module_loading import autodiscover_modules
                 autodiscover_modules('stark')


      程序启动时,会先去每个app中找stark.py文件并加载。
     
     c. 其他app中创建stark.py    
     d. 程序启动时便会自动加载 stark.py


    image

class StarkConfig(object):
    def __init__(self, model_class,site):
        self.model_class = model_class
        self.site = site

    def func(self):
        print(self.model_class)

    def run(self):
        self.func()

class AdminSite(object):
    def __init__(self):
        self._registry = {}
        self.app_name = 'stark'
        self.namespace = 'stark'

    def register(self,model_class,stark_config=None):
        # model_class=models.Role
        # stark_config=None
        if not stark_config:       # 判断是否有自定义的配置,
            stark_config = StarkConfig # 没有就用,默认的
        # model_class=models.Role
        # stark_config=RoleConfig
        self._registry[model_class] = stark_config(model_class,self)
        """
        {
            models.UserInfo: StarkConfig(models.UserInfo), # 封装:model_class=UserInfo,site=site对象
            models.Role: RoleConfig(models.Role)           # 封装:model_class=Role,site=site对象
        }
        """
        for k,v in self._registry.items():
            v.run()
            # models.UserInfo,StarkConfig对象
            # models.Role,RoleConfig对象


site = AdminSite()

stark/service/stark.py

from django.apps import AppConfig


class StarkConfig(AppConfig):
    name = 'stark'

    def ready(self):
        "Override this method in subclasses to run code when Django starts."
        from django.utils.module_loading import autodiscover_modules
        autodiscover_modules('stark')
stark/apps.py
app01/models.py
from django.db import models
class UserInfo(models.Model):
    title = models.CharField(max_length=32)

app01/stark.py
from stark.service.stark import site
from app01 import models
site.register(models.UserInfo)
app01/stark.py
原文地址:https://www.cnblogs.com/wenyule/p/9913856.html