zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    vmware 更换网络后不能上网
    IDEA “Cannot resolve symbol” 解决办法
    SpringBoot MyBatis druid数据库连接池
    解决分页插件ClassNotFoundException: org.springframework.boot.bind.RelaxedPropertyResolver
    纯CSS绘制不同角度的三角形
    原生js实现移动端点击、长按、左滑、右滑、上滑、下滑等事件模拟
    移动端下拉滚动刷新
    使用锚点定位不改变url同时平滑的滑动到锚点位置,不会生硬的直接到锚点位置
    简单的mock数据调试
    小程序textarea文本域字数控制---并显示已输入字数
  • 原文地址:https://www.cnblogs.com/wenyule/p/9913856.html
Copyright © 2011-2022 走看看