09:CBV与settings
2024-09-17 11:29:16
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)
小结
将用户不常改变的配置成隐藏文件,将修改频繁配置设为暴露文件,再通过优先级效果,实现更好的用户体验
以及插拔式设计
最新文章
- Java 消息摘要 散列 MD5 SHA
- 开始学红帽的RHCE课堂有2次课了,要记下自己的学习经历
- angularjs checkbox 框的操作
- 【Android】Android Studio 进行代码混淆,打包release APK
- MipMap
- import()函数
- Linux下文件重命名、创建、删除、修改及保存文件
- ember.js:使用笔记10 常用方法
- iBatis面试题
- 怎么让自己的java系统使用支付接口
- java写文件时,输出不完整的原因以及解决方法
- 使用LAMP创建基于wordpress的个从博客站点
- C#复习一( Twenty Days)
- SQL中EXISTS的用法(转)
- MySQL中查询时";Lost connection to MySQL server during query";报错的解决方案
- BZOJ_1486_[HNOI2009]最小圈_01分数规划
- Geometric regularity criterion for NSE: the cross product of velocity and vorticity 2: $u\times \om\cdot \n\times \om$
- 安装FireEye渗透测试套件commando-vm
- 【BZOJ4891】[TJOI2017]龙舟(Pollard_rho)
- Eclipse添加git插件上传项目到github