在介绍前面三个注意点后,开始写stark组件内容。
1 from django.apps import AppConfig 2 from django.utils.module_loading import autodiscover_modules 3 4 class StarkConfig(AppConfig): 5 name = 'stark' 6 7 def ready(self): 8 autodiscover_modules('stark')
这样项目启动时,自动查找并执行每个app的stark.py。
单例模式实现
1 class StarkSite(object): 2 def __init__(self): 3 self._registry = [] 4 self.app_name = 'stark' 5 self.namespace = 'stark' 6 7 def register(self, model_class, handler_class=None,prev=None): 8 """ 9 10 :param model_class:models中的数据库相关的类(是一个类!!) 11 :param handler_class:处理请求的视图函数所在的类 12 :param prev:url前缀 13 :return: 14 """ 15 if not handler_class: 16 handler_class = StarkHandler 17 self._registry.append({'prev':prev,'model_class':model_class,'handler':handler_class(self,model_class,prev)}) 18 19 20 def get_urls(self): 21 patterns = [] 22 for item in self._registry: 23 prev = item['prev'] 24 model_class = item['model_class'] 25 handler = item['handler'] 26 app_name = model_class._meta.app_label 27 model_name = model_class._meta.model_name 28 29 if prev: 30 patterns.append(url(r'^%s/%s/%s/'%(app_name,model_name,prev),(handler.get_urls(),None,None))) 31 else: 32 patterns.append(url(r'^%s/%s/' % (app_name, model_name), (handler.get_urls(), None,None))) 33 34 return patterns 35 36 @property 37 def urls(self): 38 return self.get_urls(),self.app_name,self.namespace 39 40 41 site = StarkSite()
(1)实例化StarkSite。以后别人导入这个模块,都是使用这个site同一个对象。
(2)添加的model类是以字典的形式存储在self._registry列表里。
(3)路由分发实现 url(r'^stark/',site.urls)