zoukankan      html  css  js  c++  java
  • 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)
    ]
    
    
  • 相关阅读:
    ffmpeg开发系列--av_read_frame()
    2013~2014
    javascript
    javascript
    javascript目录
    最长连续和与最大子矩阵
    成功者具备的十五种能力
    视频综合管理平台EasyNVS在实现代理时调用EasyDSS接口如何携带token?
    在线课堂Web无插件直播点播系统EasyDSS如何接入第三方视频管理平台EasyNVS?
    TSINGSEE青犀视频开发的EasyNTS上云网关网络穿透/远程运维在系统维护中的应用
  • 原文地址:https://www.cnblogs.com/chanyuli/p/11729670.html
Copyright © 2011-2022 走看看