FBV

FBV(function base views)就是在 url 中一个路径对应一个函数

urls.py

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index)
]

views.py

def index(request):
return render(request, 'index.html')

CBV

CBV(class base views) 就是在视图里使用类处理请求,它是基于反射实现,根据请求的方式不同,去执行不同的方法

流程:路由 --- View函数 --- dispatch执行反射

urls.py

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^students/', views.StudentsView.as_view()),
]

views.py

from django.views import View

class StudentsView(View): 

    def dispatch(self, request, *args, **kwargs):
ret = super(StudentsView, self).dispatch(request, *args, **kwargs)
return ret def get(self, *args, **kwargs):
return HttpResponse('GET') def post(self, *args, **kwargs):
return HttpResponse('POST') def put(self, *args, **kwargs):
return HttpResponse('PUT') def delete(self, *args, **kwargs):
return HttpResponse('DELETE')

请求进来,先执行这个 dispatch() ,然后调用父类 Viewdispatch()

# 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.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)

第一个参数 selfStudentsView 的对象,然后执行 getattr,返回 handler(request, *args, **kwargs),相当于找到了 StudentsView 写的 get 方法,执行返回结果 HttpResponse('GET') ,将这个结果交给 ret , ret 再返回给用户,所以看到的就是 GET

补充

django中间件的几个方法

  • process_request
  • process_view
  • process_template_response
  • process_exception
  • process_response

django的csrf_token是如何实现的

  • process_view方法实现,检查视图函数是否被 @csrf_exempt,用来免除 csrf 认证
  • 去请求体或 cookie 中获取 token

FBV知识点:给视图函数添加装饰器

情况一

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', # 全站使用 csrf 认证
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt	# 该函数无需认证
def users(request):
user_list = ['alex', 'oldboy']
return HttpResponse(json.dumps(user_list))

情况二

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', # 全站不使用 csrf 认证
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
from django.views.decorators.csrf import csrf_protect

@csrf_protect	# 该函数需要认证
def users(request):
user_list = ['alex', 'oldboy']
return HttpResponse(json.dumps(user_list))

CBV知识点:给视图类添加装饰器

无法给单独的函数添加装饰器,必须加到 dispatch() 上,或者在类上加装饰器

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', # 全站使用 csrf 认证
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

方式一:dispatch() 加装饰器

from django.shortcuts import HttpResponse
from django.views import View
from django.utils.decorators import method_decorator class StudentsView(View): @method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
ret = super(StudentsView, self).dispatch(request, *args, **kwargs)
return ret def get(self, *args, **kwargs):
return HttpResponse('GET') def post(self, *args, **kwargs):
return HttpResponse('POST') def put(self, *args, **kwargs):
return HttpResponse('PUT') def delete(self, *args, **kwargs):
return HttpResponse('DELETE')

方式二:类加装饰器

from django.shortcuts import HttpResponse
from django.views import View
from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name='dispatch') # name表示只给dispatch加装饰器
class StudentsView(View): def get(self, *args, **kwargs):
return HttpResponse('GET') def post(self, *args, **kwargs):
return HttpResponse('POST') def put(self, *args, **kwargs):
return HttpResponse('PUT') def delete(self, *args, **kwargs):
return HttpResponse('DELETE')

总结

  • CBV 定义类的时候必须要继承 View
  • 在写 url 的时候必须要加 as_view()
  • 所有的方法本质上都是通过 dispatch 这个函数反射执行,如果想要在执行 getpost 方法前执行其他步骤,可以重写 dispatch
  • 添加装饰器前必须导入from django.utils.decorators import method_decorator
  • 添加装饰器的格式必须为 @method_decorator(),括号里面为装饰器的函数名
  • 给类添加是必须声明 name
  • 注意 csrf-token 装饰器的特殊性,它只能加在 dispatch 上面

CBV与FBV的更多相关文章

  1. python自动化开发-[第二十天]-form表单,CBV和FBV,序列化

    1.CBV和FBV的用法 2.序列化用法 3.form表单 一.CBV和FBV 1.cbv是 class based view(基于类),fbv是function based view(基于函数) 2 ...

  2. Django(视图 CBV、FBV)

    day67 参考:http://www.cnblogs.com/liwenzhou/articles/8305104.html CBV和FBV 我们之前写过的都是基于函数的view,就叫FBV.还可以 ...

  3. Django中的CBV和FBV

    Django中的CBV和FBV 一.  CBV CBV是采用面向对象的方法写视图文件. CBV的执行流程: 浏览器向服务器端发送请求,服务器端的urls.py根据请求匹配url,找到要执行的视图类,执 ...

  4. django视图 CBV 和 FBV

    目录 视图 CBV 和 FBV 什么是视图? FBV function based view 基于函数的视图 CBV class based view 基于类的视图 小技巧 CBV 如何获取页面请求类 ...

  5. Django之CBV和FBV

    Django之CBV和FBV CBV和FBV是C和F的区别: C是Class,F是Function 在请求中,有GET请求和POST请求. 在写CBV时,url是可以对应一个类的,在类中,分别写出GE ...

  6. django补充CBV和FBV模式

    django补充CBV和FBV模式FBV模式---函数:经常用的方式CBV模式---类CBV中url连接时函数名后面要接.as_view()class index(views.View): @... ...

  7. Django框架(五)-- 视图层:HttpRequest、HTTPResponse、JsonResponse、CBV和FBV、文件上传

    一.视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. ...

  8. Django CBV和FBV

    Django CBV和FBV Django内部CBV内部接收方法操作: 1.通过客户端返回的请求头RequestMethod与RequesrtURL,会以字符串形式发送到服务器端. 2.取到值后通过d ...

  9. CBV和FBV

    CBV和FBV 刚开始写的视图都是基于函数版本的,称为FBV,后来写了一个NB的叫CBV,就是基于类的 FBV就是在URL中的一个路径对应一个函数 urlpatterns = [ url(r'^adm ...

  10. Django框架(六)—— 视图层:HttpRequest、HTTPResponse、JsonResponse、CBV和FBV、文件上传

    目录 视图层 一.视图函数 二.视图层之HttpRequest对象 三.视图层之HttpResponse对象 四.视图层之JsonResponse对象 五.CBV和FBV 六.文件上传 视图层 一.视 ...

随机推荐

  1. Python学习之旅(十二)

    Python基础知识(11):高级特性 一.分片(切片) 通过索引来获取一定范围内的元素 #字符串 s="Alice" s[0:4:2] 结果: 'Ai' #列表 l=[1,2,3 ...

  2. vue设置初始对象时为空报错

    解决办法:在初始化时提供完整的数据结构

  3. odoo配置文件详解

    addons模块的查找路径 addons_path = D:\odoo\Odoo 10.0\server\odoo\addons 超级管理员(用于创建,还原和备份数据库的操作) admin_passw ...

  4. kickstart ---无人值守安装

    kickstart 实战 http://man.linuxde.net/download/CentOS_6_9镜像 安装: 关闭防火墙 且在编辑虚拟网络的vnet8中要取消使用本地dhcp项 1.yu ...

  5. 16.1-uC/OS-III同步 (任务内建信号量)

    1.经常通过发送信号量实现同步.每个任务都有内建的信号量,通过任务内建的信号量不仅可以简化信号量通信的代码而且更加有效. 与任务内建的信号量相关的函数都是以 OSTaskSem???()为前缀的.相关 ...

  6. Jmeter使用之-断言

    添加响应断言 ,一般下面这样选择断言的设置就可以了 个人习惯是直接从响应数据中直接复制正确的接口返回值到断言的测试模式中,如下          !!!但是这样复制的是有问题的 ,需要在测试模式中去掉 ...

  7. Android Studio--》Gradle Scripts配置说明

    什么是Gradle? Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. 安装 ...

  8. MySQL的分区、分表、集群

    1.分区 mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一 ...

  9. 六、APP开发的主角——UIViewController

    MVC框架模式 MVC即model(模型).view(视图)和controller(控制器)的缩写,是一种软件设计模式,专用于含有图形化用户界面的软件设计,自20世纪80年代以来已经有30多年的历史了 ...

  10. 深入理解Java虚拟机3-chap4-5-斗之气10段

    一.虚拟机性能监控与故障处理 1.JDK的命令行工具:对jdk/lib/tools.jar的薄包装,Linux下可能是Shell编写,执行类似于Linux中的命令 2.可视化工具JConsole 打开 ...