博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3月5日学习内容整理:django中的CBV和FBV,以及csrf_token的实现方法以及在CBV中的应用...
阅读量:6250 次
发布时间:2019-06-22

本文共 2794 字,大约阅读时间需要 9 分钟。

一、FBV  

就是基于函数的视图    function  base  view

就是之前写过最多的那种形式

 

二、CBV

就是基于类的视图

1、原理即实现流程:

本质通过面向对象的反射

实现流程:

请求到达路由系统后匹配成功后,会执行自定义view类的as_view方法,也就是执行继承的djangoView类的as_view方法,然后执行里面的view方法,在执行dispatch方法,如果自定义view类没有dispatch方法就会去执行django的view类的dispatch方法,在这个dispatch方法里就会首先判断请求的类型是否存在,有的话就利用反射执行对应的请求方法的类型函数

总结:URL------》as_view------》view-------》dispatch,反射执行对应函数

2、url文件中:

# views是视图文件# StudentsView是自己写的类# as_view()是固定搭配url(r'^students/', views.StudentsView.as_view()),

 

3、视图文件views.py中:CBV中,django会根据请求的类型自动调用对应的方法,比如get请求就调用get方法,post请求就调用post方法

》》》方式一:

from django.views import View# 自己写的类必须要继承django的View类class StudentsView(View):    def get(self,request,*args,**kwargs):        return HttpResponse('GET')    def post(self, request, *args, **kwargs):        return HttpResponse('POST')    def put(self, request, *args, **kwargs):        return HttpResponse('PUT')    def delete(self, request, *args, **kwargs):        return HttpResponse('DELETE')

 

》》》方式二:可以用自己定义的类中的dispatch方法,然后再用自己定义的具体的view类去继承

from django.views import Viewclass MyBaseView(object):    def dispatch(self, request, *args, **kwargs):        print('before')        ret = super(MyBaseView,self).dispatch(request, *args, **kwargs)        print('after')        return retclass StudentsView(MyBaseView,View):    def get(self,request,*args,**kwargs):        print('get方法')        return HttpResponse('GET')    def post(self, request, *args, **kwargs):        return HttpResponse('POST')    def put(self, request, *args, **kwargs):        return HttpResponse('PUT')    def delete(self, request, *args, **kwargs):        return HttpResponse('DELETE')

 

 

 

三、关于csrf_token的验证

我们都知道csrf_token的验证时通过django的中间件来完成的

具体是由中间件的process_view方法执行的

1、在FBV中,我们可以通过两个装饰器来控制对某个函数的csrf_token的验证

from django.views.decorators.csrf import csrf_exempt,csrf_protect# 代表被装饰的函数不需要验证csrf_token@csrf_exempt# 代表被装饰的函数需要验证csrf_token@csrf_protect

 

2、在CBV中,这两个装饰器就不能直接用了

》》》方式一:加在dispatch方法上

from django.views.decorators.csrf import csrf_exempt,csrf_protectfrom django.utils.decorators import method_decoratorclass StudentsView(View):        # 利用method_decorator装饰器,加参数        # 代表post方法就不需要验证csrf_token,若是csrf_protect就是需要    @method_decorator(csrf_exempt)    def dispatch(self, request, *args, **kwargs):        return super(StudentsView,self).dispatch(request, *args, **kwargs)    def get(self,request,*args,**kwargs):        print('get方法')        return HttpResponse('GET')

 

》》》方式二:加在类上

from django.views.decorators.csrf import csrf_exempt,csrf_protectfrom django.utils.decorators import method_decorator# 多一个name参数,值是dispatch,跟直接加载dispatch方法上是一样的@method_decorator(csrf_exempt,name='dispatch')class StudentsView(View):    def get(self,request,*args,**kwargs):        print('get方法')        return HttpResponse('GET')

 

转载于:https://www.cnblogs.com/wanghl1011/articles/8509818.html

你可能感兴趣的文章
干货:解码OneData,传说中的阿里数据中台是如何练成的?
查看>>
gorename: easy refactoring tool for Golang[转]
查看>>
数据库进程间通信解决方案
查看>>
Guice框架-DI(依赖注入之作用域)
查看>>
海量数据计算应该如何选择数据库
查看>>
CodeCounter
查看>>
MongoDB 如何保证 oplog 顺序?
查看>>
TF-IDF与余弦相似性的应用(一):自动提取关键词
查看>>
冒泡排序、插入排序、选择排序、快速排序、二分查找(Objective-C实现)
查看>>
nginx反向代理入门
查看>>
Ionic 开发中遇到的常见问题及解决方案
查看>>
mysql数据库存储路径更改 数据文件位置
查看>>
ExtJS5学习之MVVC
查看>>
PDF文档压缩
查看>>
[J2ME]手机流媒体之实作[附源码][与RTSP/MMS协议无关]
查看>>
Scala程序设计读书笔记[1:5]
查看>>
概率论快速学习05:随机变量 二项分布 泊松分布
查看>>
构建Tiny生态圈
查看>>
【vnc】vncserver: couldn't find "xauth" on your PATH 问题
查看>>
扩大Ubuntu的空间
查看>>