Django框架——CBV及源码分析
CBV (基于类的视图函数)
代码示例:
urls.py
url(r‘^login/‘,views.MyLogin.as_view())
views.py
from django.views import View
class MyLogin(View):
def get(self,request):
print("from MyLogin get方法")
return render(request,‘login.html‘)
def post(self,request):
return HttpResponse("from MyLogin post方法")研究方向:
1.从url进入
url(r‘^login/‘,views.MyLogin.as_view())
由于函数名加括号执行优先级最高,所以这一句话一写完会立刻执行as_view()方法,返回view
@classonlymethod
def as_view(cls, **initkwargs): # cls就是我们自己的写的类 MyLogin
def view(request, *args, **kwargs):
self = cls(**initkwargs) # 实例化产生MyLogin的对象 self = MyLogin(**ininkwargs)
if hasattr(self, ‘get‘) and not hasattr(self, ‘head‘):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
# 上面的几句话都仅仅是在给对象新增属性
return self.dispatch(request, *args, **kwargs) # dispatch返回什么 浏览器就会收到什么
# 对象在查找属性或者方法的时候 你一定要默念 先从对象自己这里找 然后从产生对象的类里面找 最后类的父类依次往后
return view通过源码发现url匹配关系可以变形成
url(r‘^login/‘,views.view) # FBV和CBV在路由匹配上是一致的 都是url后面跟函数的内存地址
2.当浏览器中输入login会立刻触发view函数的运行,走上面的view函数,再进入到dispatch方法
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn‘t exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn‘t on the approved list.
# 我们先以GET为例
if request.method.lower() in self.http_method_names: # 判断当前请求方法是否在默认的八个方法内
# 反射获取我们自己写的类产生的对象的属性或者方法
# 以GET为例 handler = getattr(self,‘get‘,‘取不到报错的信息‘)
# handler = get(request)
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # 直接调用我们自己的写类里面的get方法
# 源码中先通过判断请求方式是否符合默认的八个请求方法 然后通过反射获取到自定义类中的对应的方法执行通过获取对应的方法(get,post),然后执行view.py中对应的请求方法
