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
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()
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')
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)