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)

 

小结

  将用户不常改变的配置成隐藏文件,将修改频繁配置设为暴露文件,再通过优先级效果,实现更好的用户体验

  以及插拔式设计


 

 

 

 

posted @ 2021-06-06 11:36  Jerry`  阅读(47)  评论(0编辑  收藏  举报