stark

 在介绍前面三个注意点后,开始写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)

原文地址:https://www.cnblogs.com/steven2020/p/10700019.html