CBV源码分析

Posted chanyuli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CBV源码分析相关的知识,希望对你有一定的参考价值。

CBV源码分析

html(这里只是单纯的用来做请求而已,没什么用处,只是让后端来判断走哪个方法)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>

</head>
<body>
<form action="" method="get">
    <input type="submit">
</form>
</body>
</html>

view

from django.views import View
class MyReg(View):
    def get(self,request):
        return render(request,'reg.html')
    def post(self,request):
        return HttpResponse("我是MyReg类中post方法")
FBV与CBV 即CBV源码分析
        FBV(Function Based View) 基于函数的视图:我们之前一直都是这种模式,所以没什么好讲的了
        
        CBV(Class Based View) 基于类的视图
            你在类中写了两个方法 一个叫get一个叫post
            为什么前端get请求来就会触发get方法
            post请求来就会触发post方法  如何实现的???
        
        # CBV路由
        url(r'^reg/',views.MyReg.as_view())
        
        @classonlymethod
        def as_view(cls, **initkwargs):
            def view(request, *args, **kwargs):
                self = cls(**initkwargs)  # cls就是我们自己的写的MyReg类
                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)
                # 对象在查找属性或方法的时候 顺序是什么?  先从自己找 再从产生对象的类中找  再去类的父类中找...
                """也就意味着你在看源码的时候 你一定要牢记上面的话"""
            return view
        
        
        
        """CBV最精髓的部分"""
        def dispatch(self, request, *args, **kwargs):
            if request.method.lower() in self.http_method_names:  # 判断当前请求方式在不在默认的八个请求方式中
                handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
                # handler = getattr(自己写的类产生的对象,'小写的请求方法(getpost)','获取不到对应的方法就报错'),这里就拿到了(以GET为例)我们自己写的get方法了。
                # handler就是我们自己定义的跟请求方法相对应的方法的函数内存地址
            else:
                handler = self.http_method_not_allowed
            return handler(request, *args, **kwargs)  # 在调用获取到的方法,也就相当于get()
        这时候就解决了我们上面的问题了。

看一下我们最开始写的 urls

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^reg/', views.MyReg.as_view()),
    #这里其实就是 url(r'^reg/',views.view)
]

以上是关于CBV源码分析的主要内容,如果未能解决你的问题,请参考以下文章

Django框架——CBV及源码分析

FBV与CBV 及CBV源码分析

cbv源码分析

CBV源码分析

Django CBV源码分析

Django中CBV和Restful API中的APIView源码分析