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)

小结

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

  以及插拔式设计


 

最新文章

  1. Java 消息摘要 散列 MD5 SHA
  2. 开始学红帽的RHCE课堂有2次课了,要记下自己的学习经历
  3. angularjs checkbox 框的操作
  4. 【Android】Android Studio 进行代码混淆,打包release APK
  5. MipMap
  6. import()函数
  7. Linux下文件重命名、创建、删除、修改及保存文件
  8. ember.js:使用笔记10 常用方法
  9. iBatis面试题
  10. 怎么让自己的java系统使用支付接口
  11. java写文件时,输出不完整的原因以及解决方法
  12. 使用LAMP创建基于wordpress的个从博客站点
  13. C#复习一( Twenty Days)
  14. SQL中EXISTS的用法(转)
  15. MySQL中查询时"Lost connection to MySQL server during query"报错的解决方案
  16. BZOJ_1486_[HNOI2009]最小圈_01分数规划
  17. Geometric regularity criterion for NSE: the cross product of velocity and vorticity 2: $u\times \om\cdot \n\times \om$
  18. 安装FireEye渗透测试套件commando-vm
  19. 【BZOJ4891】[TJOI2017]龙舟(Pollard_rho)
  20. Eclipse添加git插件上传项目到github

热门文章

  1. java中的NAN和INFINITY
  2. zTree增加树形菜单格式
  3. 序列化-Json
  4. beta设计和计划
  5. Jmeter(四十五) - 从入门到精通高级篇 - Jmeter之网页爬虫-上篇(详解教程)
  6. 再议GCC编译时的静态库依赖顺序问题
  7. at在指定的时间执行命令+atq列出用户待处理作业(jobs)
  8. [python3.7]列表
  9. 面向对象——python核心编程第二版
  10. echo -n -e "请输入重启间隔的时间(分钟):\t"