码迷,mamicode.com
首页 > 其他好文 > 详细

Django框架——CBV及源码分析

时间:2020-01-31 18:53:23      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:error   变形   login   only   请求方法   exist   直接   源码分析   括号   

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中对应的请求方法

技术图片

 

Django框架——CBV及源码分析

标签:error   变形   login   only   请求方法   exist   直接   源码分析   括号   

原文地址:https://www.cnblogs.com/wangcuican/p/12246050.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!