天天看点

django CBV模型

1.CBV 和 FBV

   FBV function  based view     CBV class based view

2. CBV的使用流程

   在 view中 导入   from django.views import View

   1.创建一个类   继承父类   View 

class Cbv(View):
    def get(self,request):
        return HttpResponse('Ok!!!')
    def post(self,request)
        pass
           

      自动判断请求方法  而执行相对应函数

    2. 在路由 url文件中 

                 url(r'^add_press/$', views.Cbv.as_view())

3.执行原理   views.Cbv.as_view()

            三个方法 :as_vieiw---->view---->dispatch-----存在 / 不存在 (请求方法) ----返回响应

    1.在 as_vieiw() 中执行 view 方法   return self.dispatch() -->执行dispatch

       dispatch():中  通过 getattr 反射 拿到 子类的 get 或post 方法   给到handler 再返回执行

          1.判断请求方法 是否存在于  http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

          2. 如果存在 就执行子类 中对应的方法(get,post.......)

          3.handler = getattr(self, request.method.lower(), self.http_method_not_allowed) 

               此时handler 就是一个 方法    return  handler (request ,*arg,**kwgs) 加括号执行

     2.返回handler   相当于是一个HttpResponse 对象   返回到django  处理 httpresponse 响应

     3.如果请求方法 不存在,则django内置方法 返回一个 不存在的   HttpResponse 页面 

6. 加装饰器

     FBV 普通加法

            @wrapper

            def test()

        CBV 

            from django.utils.decorators import method_decorator   使用django 封装的方法  使用装饰器

            1. 加在方法上

                @method_decorator(timer)

                def get(self, request):

            2. 加在dispatch上                   在CBV中只有加载dispatch 上才有用

                @method_decorator(timer)

                def dispatch(self, request, *args, **kwargs)

            3. 加在类上

                @method_decorator(timer,name='post')

                @method_decorator(timer,name='get')

                class AddPress(View):

7.  request 和response

       1.request .GET('name')  获取url中的参数                            2.request.POST('name') 获取 form提交的 或ajax 提交的data数据

       3. request. file 获取上传文件                                                4.request.body数据真正存放的地方

       5.request.get_host                                                                6.request.is_ajax

       HttpResponse          render                redirect