python测试开发django-73.django视图 CBV 和 FBV
前言
FBV(function base views) 就是在视图里使用函数处理请求,这一般是学django入门的时候开始使用的方式。
CBV(class base views) 就是在视图里使用类处理请求,这是面向对象的编程方式。
面试的时候基本上都是问到:你平常写的视图是基于函数的视图 (FBV),还是基于类的视图 (CBV),两者的区别在哪?
如果你只会写基于函数的视图,那说明还处于初级入门的阶段了。
FBV 模式
FBV(function base views)在views.py文件中定义视图函数来处理用户请求,函数中通过 if 判断 request.method 请求方式是 GET 还是 POST请求做对应的处理。
# views.py
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
# 上海-悠悠,QQ交流群:750815713
# Create your views here.
# function base views
def fbvdemo(request):
'''function base views'''
context = {
"code": 0,
"msg": ""
}
if request.method == "GET":
context["msg"] = "这是fbvdemo get请求"
return JsonResponse(context)
if request.method == "POST":
context["msg"] = "这是fbvdemo POST请求"
return JsonResponse(context)
urls.py配置访问路径
from django.conf.urls import url
urlpatterns = [
url(r'^fbvdemo/$', views.fbvdemo)
]
CBV 模式
CBV(class base views) 就是在视图里使用类处理请求
- 自定义的类必须继承 View 父类
- 提高了代码的复用性,可以使用面向对象的技术,比如 Mixin(多继承)
- 可以用不同的函数针对不同的 HTTP 方法处理,而不是通过很多if判断,提高代码可读性
- CBV 模式继承的View类提供了多种请求方式对应的响应函数不需要在进行判断,可以直接在子类重写继承的方法
- CBV 模式子类继承重写父类请求方式的响应函数通过父类 dispatch 方法进行反射分发
- 在 urls.py 路由系统中必须使用 Myview.as_view() 替代视图函数
# views.py
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
# Create your views here.
# 上海-悠悠,QQ交流群:750815713
# class base views
class Cbvdemo(View):
context = {
"code": 0,
"msg": ""
}
def get(self, request):
self.context["msg"] = "这是Cbvdemo get请求"
return JsonResponse(self.context)
def post(self, request):
self.context["msg"] = "这是Cbvdemo post请求"
return JsonResponse(self.context)
urls.py 配置访问路径
from django.conf.urls import url
urlpatterns = [
url(r'^fbvdemo/$', views.fbvdemo),
url(r'^cbvdemo/$', views.Cbvdemo.as_view()),
]
这2种方式从功能上讲都可以实现对应的功能,从代码的可读性来讲,建议多使用 CBV 模式。
另外通过 CBV 如果想要在执行get或post方法前执行其他步骤,可以重写dispatch。
login_requierd登录校验
FBV 模式如果需要加登录之后才能访问,只需在函数上加装饰器@login_required
from django.contrib.auth.decorators import login_required
# function base views
@login_required
def fbvdemo(request):
'''function base views'''
context = {
"code": 0,
"msg": ""
}
if request.method == "GET":
context["msg"] = "这是fbvdemo get请求"
return JsonResponse(context)
if request.method == "POST":
context["msg"] = "这是fbvdemo POST请求"
return JsonResponse(context)
没加装饰器之前,可以直接访问
C:\Users\dell>http http://localhost:8000/fbvdemo/
HTTP/1.1 200 OK
Content-Length: 55
Content-Type: application/json
Date: Sat, 23 Nov 2019 06:26:58 GMT
Server: WSGIServer/0.2 CPython/3.6.0
Vary: Origin
X-Frame-Options: SAMEORIGIN
{
"code": 0,
"msg": "这是个get请求"
}
加了@login_required装饰器后,没登录的话会302重定向到登录页 /accounts/login/
C:\Users\dell>http http://localhost:8000/fbvdemo/
HTTP/1.1 302 Found
Content-Length: 0
Content-Type: text/html; charset=utf-8
Date: Sat, 23 Nov 2019 06:27:19 GMT
Location: /accounts/login/?next=/fbvdemo/
Server: WSGIServer/0.2 CPython/3.6.0
Vary: Origin, Cookie
X-Frame-Options: SAMEORIGIN
CBV 模式加 login_requierd 登录校验
method_decorator给CBV视图添加登录校验。
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
# 上海-悠悠,QQ交流群:750815713
class Cbvdemo(View):
context = {
"code": 0,
"msg": ""
}
@method_decorator(login_required)
def get(self, request):
self.context["msg"] = "这是Cbvdemo get请求"
return JsonResponse(self.context)
@method_decorator(login_required)
def post(self, request):
self.context["msg"] = "这是Cbvdemo post请求"
return JsonResponse(self.context)
也可以直接在class上用装饰器
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
@method_decorator(login_required, name='get')
@method_decorator(login_required, name='post')
class Cbvdemo(View):
context = {
"code": 0,
"msg": ""
}
def get(self, request):
self.context["msg"] = "这是Cbvdemo get请求"
return JsonResponse(self.context)
def post(self, request):
self.context["msg"] = "这是Cbvdemo post请求"
return JsonResponse(self.context)
python测试开发django-73.django视图 CBV 和 FBV的更多相关文章
- python测试开发django-rest-framework-63.基于函数的视图(@api_view())
前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...
- django视图 CBV 和 FBV
目录 视图 CBV 和 FBV 什么是视图? FBV function based view 基于函数的视图 CBV class based view 基于类的视图 小技巧 CBV 如何获取页面请求类 ...
- python测试开发django-197.django-celery-beat 定时任务
前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...
- python测试开发django-36.一对一(OneToOneField)关系查询
前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...
- python测试开发django-16.JsonResponse返回中文编码问题
前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...
- python测试开发django-15.查询结果转json(serializers)
前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...
- 2019第一期《python测试开发》课程,10月13号开学
2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...
- 《Python测试开发技术栈—巴哥职场进化记》—前言
写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...
- Python测试开发-创建模态框及保存数据
Python测试开发-创建模态框及保存数据 原创: fin 测试开发社区 前天 什么是模态框? 模态框是指的在覆盖在父窗体上的子窗体.可用来做交互,我们经常会看到模态框用来登录.确定等等,到底是怎 ...
- python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)
前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...
随机推荐
- java web开发需要注意的地方
java需要注意的 1.字符串值相等比较 c#用双等号(==)来进行 字符串值相等比较.如下: string a="3"; string b="3"; if(a ...
- 如何让position fixed不再基于浏览器窗口定位
position:fixed默认是相对浏览器定位的. 就是将某个元素固定在浏览器的某个确定的位置,不随滚动条的移动而变化: MDN对position: fixed有一个注释: 当元素祖先的 trans ...
- 【网络知识之六】UDP
UDP(User Datagram Protocol)用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务. 一.UDP报头UDP报头由4个部分组成,其中两个是可选的(粉红背 ...
- Zuul的使用,路由访问映射规则
一.Zuul的介绍 Zuul包含了对请求的路由和过滤两个最主要的功能: 其中路由功能负责将外部请求转发到具体的微服务实力上,是实现外部访问统一入口基础而过滤器功能则负责对请求的处理过程进行干预,是实现 ...
- 联合CRF和字典学习的自顶向下的视觉显著性-全文解读
top-down visual saliency via joint CRF anddictionary learning 自顶向下的视觉显著性是使用目标对象的可判别表示和一个降低搜索空间的概率图来进 ...
- windows下xshell连接虚拟机的CentOS 7
1.虚拟机设置 2.虚拟机的“编辑”-“虚拟网络编辑器” 3.windows 中运行“cmd”,输入“ipconfig”查看ip,避免冲突 4.在虚拟机网络编辑器界面中,选择“VMnet8” 5.记住 ...
- 【JVM学习】3.深入解析强引用、软引用、弱引用、幻象引用
来源:公众号:猿人谷 关于强引用.软引用.弱引用.幻象引用的区别,在很多公司的面试题中经常出现,可能有些小伙伴觉得这个知识点比较冷门,但其实大家在开发中经常用到,如new一个对象的时候就是强引用的应用 ...
- Java解压和压缩带密码的zip或rar文件(下载压缩文件中的选中文件、向压缩文件中新增、删除文件)
JAVA 实现在线浏览管理zip和rar的工具类 (有密码及无密码的)以及下载压缩文件中的选中文件(向压缩文件中新增.删除文件) 这是之前的版本 JAVA 解压压缩包中指定文件或实现压缩文件的预览及下 ...
- Prometheus 告警分配到指定接收组
Prometheus 告警分配到指定接收组 route属性用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配. 主要处理流程:1. 接收到Alert,根据labels判断属于 ...
- 【转】常用PLC通讯协议
三菱FX系列PLC通讯测试 发送帧(Hex): 起始(STX) 02 命令(CMD) 30 首地址(ADDRESS) 30 30 41 30 字节数(BYTES) 30 31 终止(ETX) 03 校 ...