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
  • 相关阅读:
    Effective Java 第三版——72. 赞成使用标准异常
    Effective Java 第三版——71. 避免不必要地使用检查异常
    Effective Java 第三版——70. 对可恢复条件使用检查异常,对编程错误使用运行时异常
    Effective Java 第三版——69. 仅在发生异常的条件下使用异常
    Effective Java 第三版——68. 遵守普遍接受的命名约定
    Effective Java 第三版——67. 明智谨慎地进行优化
    Effective Java 第三版——66. 明智谨慎地使用本地方法
    Effective Java 第三版——65. 接口优于反射
    Effective Java 第三版——64. 通过对象的接口引用对象
    Effective Java 第三版——63. 注意字符串连接的性能
  • 原文地址:https://www.cnblogs.com/wenyule/p/9913856.html
Copyright © 2011-2022 走看看