CBV与settings
CBV源码
# 切入点 url(r'^login/', views.Mylogin.as_view()) '''类名点名字还加括号 名字要么是绑定给类的方法 要么是无参函数''' 1.as_view()绑定给类的方法 @classonlymethod def as_view(cls, **initkwargs) 2.CBV路由匹配本质与FBV一致 # CBV url(r'^login/', views.Mylogin.as_view()) # CBV本质 # url(r'^login/', views.view) 3.匹配成功之后执行view函数代码 def view(request, *args, **kwargs): self = cls(**initkwargs) return self.dispatch(request, *args, **kwargs) 4.查看dispatch方法(对象查找属性和方法一定要严格按照顺序来) def dispatch(self, request, *args, **kwargs): # 判断当前请求方法是否符合八个默认的请求方法中 # 1.get if request.method.lower() in self.http_method_names: # getattr(对象,'get','拿不到的报错信息') >>> Mylogin里面的get方法 handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) # get(request,...)
settings源码
django有两个配置文件 一个是暴露给用户自定义的配置 一个是项目默认的配置 用户没有配置的情况下使用的是项目默认的配置 用户配置了的情况下则使用用户配置的 如何实现 先读取项目默认配置 再读取自定义配置 # 字典的键存在则替换 不存在则创建 from django.conf import settings class LazySettings(...): def _setup(self, name=None): settings_module = os.environ.get(ENVIRONMENT_VARIABLE) # 'day53.settings' self._wrapped = Settings(settings_module) # Settings('day53.settings') class Settings(object): def __init__(self, settings_module): # 'day53.settings' for setting in dir(global_settings): # 获取全局配置文件可以点的变量名 if setting.isupper(): # 校验配置必须全大写 setattr(self, setting, getattr(global_settings, setting)) # setting指代的是所有全大写的变量名 # getattr(global_settings, setting)获取全大写变量名对应的值 # 给对象设置属性 可以简单的理解为 给字典添加键值对 self.SETTINGS_MODULE = settings_module # 'day53.settings' mod = importlib.import_module(self.SETTINGS_MODULE) settings = LazySettings(...) for setting in dir(mod): # 获取 if setting.isupper(): setting_value = getattr(mod, setting) setattr(self, setting, setting_value)
小结
将用户不常改变的配置成隐藏文件,将修改频繁配置设为暴露文件,再通过优先级效果,实现更好的用户体验
以及插拔式设计
愿君前程似锦,归来仍是少年