一. 概念
FBV(function base views) 顾名思义基于函数的视图类

CBV(class base views)基于类的视图类

至于区别呢? 我觉得只是写法上的不一样, 实现的结果都是一样的, 我比较喜欢用CBV模式, 因为在Django中内部帮我做了请求方式的判断, 无需用户实现方法判断逻辑, 来看看代码的区别吧

二. 实现代码
1.FBV 
fbv就是在url中一个路径对应一个函数. 在工程下的url中写如下代码

from api import viewsurlpatterns = [path('admin/', admin.site.urls),path('', include('api.urls')),url(r'^test/', views.test_fbv)
]


然后在api的views中写如下测试函数:

def test_fbv(request):if(request.method == 'POST'):return HttpResponse("post")if (request.method == 'PUT'):return HttpResponse("put")if (request.method == 'GET'):return HttpResponse("get")

然后运行整个整个工程, 命令行输入python manage.py runserver

因为我的是linux系统, 就选用restclient这个插件进行api的测试

点完send后再看看 返回什么数据, 在response中可以 看到get

可以看到和我们想象的结果一样, 那我们在试试其他的请求方式, 比如put, post等 和我们代码写的一样, 这里我就不截图了

基于方法的视图

REST framework 也允许使用基于函数的视图。它提供了一套简单的装饰器来包装你的函数视图,以确保它们接收 Request(而不是 Django HttpRequest)实例并允许它们返回 Response(而不是 Django HttpResponse),并允许你配置该请求的处理方式。

@api_view()

用法:@api_view(http_method_names=['GET'])

api_view 是一个装饰器,用 http_method_names 来设置视图允许响应的 HTTP 方法列表,举个例子,编写一个简单的视图,手动返回一些数据。

from rest_framework.decorators import api_view@api_view()
def hello_world(request):return Response({"message": "Hello, world!"})

默认情况下,只有 GET 方法会被接受。其他方法将以 "405 Method Not Allowed" 进行响应。要使用其他方法,请指定视图允许的方法,如下所示:

@api_view(['GET', 'POST'])
def hello_world(request):if request.method == 'POST':return Response({"message": "Got some data!", "data": request.data})return Response({"message": "Hello, world!"})

API 策略装饰器 (policy decorators)

为了覆盖默认设置,REST framework 提供了一系列可以添加到视图中的附加装饰器。这些必须在 @api_view 装饰器之后(下方)。

例如,要创建一个使用 throttle 来确保它每天只能由特定用户调用一次的视图,请使用 @throttle_classes 装饰器,传递一个 throttle 类列表:

from rest_framework.decorators import api_view, throttle_classes
from rest_framework.throttling import UserRateThrottleclass OncePerDayUserThrottle(UserRateThrottle):rate = '1/day'@api_view(['GET'])
@throttle_classes([OncePerDayUserThrottle])
def view(request):return Response({"message": "Hello for today! See you tomorrow!"})

这些装饰器对应于 APIView上设置的策略属性。

可用的装饰器有:

@renderer_classes(...)

@parser_classes(...)

@authentication_classes(...)

@throttle_classes(...)

@permission_classes(...)

每个装饰器都有一个参数,它必须是一个类列表或者一个类元组。

 

2. CBV
CBV就是在url中一个路径对应一个类

在上述工程下的urls下添加如下代码

 
urlpatterns = [path('admin/', admin.site.urls),path('', include('api.urls')),url(r'^test_FBV/', views.test_FBV),url(r'^test_CBV/', views.test_CBV.as_view())
]

注意当用cbv模式写url时类后面一定要用as_view()方法, 这是规定格式

然后在api下的views文件中写如以下逻辑代码

from django.views import Viewclass test_CBV(View):# 以get形式访问会执行get函数,一般情况下获取数据def get(self, *args, **kwargs):return HttpResponse('get')# 以post形式访问的话会执行post函数,一般情况下发送数据def post(self, *args, **kwargs):return HttpResponse('post')

这里做几点说明:

1.cbv模式下的视图类一定要继承Views类

2. 然后重定向get, post, put请求方法等, 实现不同的请求方法实现不同的逻辑代码, api验证这部分我就不说了, 直接用restclient测试就可以了
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/456243.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/456243.shtml
英文地址,请注明出处:http://en.pswp.cn/news/456243.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rpm查询

rpm -q 的用法:1、 rpm -qa 可以查看所有已经安装过的rpm包2、rpm -qf 文件名绝对路径,可以查看该文件由哪个包安装的3、 rpm -ql 包名,可以查看该包安装哪些文件4、 rpm -qi 包名,可以查看该包的详细信息查询一个包是否安装命令&…

IntelliJ idea学习资源

工作需要, 最近得从Eclipse转战到Idea, 找了些不错的学习资料: 1, 从eclipse上迁移过来的用户说明: https://www.jetbrains.com/help/idea/2016.3/eclipse.html 2, 极客学院的idea使用入门教程: http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/project-compositi…

linux下的安装:openssl

openssl简介 openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有:SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OC…

使用WinIO库实现保护模式下的IO和内存读写

问题已解决: 原因是函数的调用方式与WinIO中不一致,使用的时候漏掉了__stdcall。 函数原定义为: 在实际的GPIO读写中遇到以下问题: SetPortVal可正常写入,但是GetPortVal无法读取,程序崩溃,问题…

php 一些个 常用 函数

urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%。urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其原理就是把十六进制字符串转换为中文字符json_decode(json,true); 输出的…

windows10中远程访问凭据不工作

远程同学电脑,发现输入账号密码还是不行,提示您的凭据不工作,问题解决:WinR---gpedit.msc网络访问----经典。转载于:https://blog.51cto.com/germa66/1934745

pycharm的 crtl + r 使用正则表达式进行 request-header格式更改

pycharm的 crtl r 使用正则表达式进行 request-header格式更改 复制粘贴之前 使用 ‘’‘ ’‘’ 保证格式不乱 改为正确格式

Android(组件大全)

ORM: Android GreenDao sqlite UI: Snackbar是Android支持库中用于显示简单消息并且提供和用户的一个简单操作的一种弹出式提醒。当使用Snackbar时,提示会出现在消息最底部,通常含有一段信息和一个可点击的按钮。Support Design Library转载于:https://w…

QT的常用对话框的应用

QMessageBox类提供了常用的弹出式对话框&#xff1a;提示、警告、错误、询问、关于对话框 需要添加头文件 #include <QMessageBox> MESSAGE 是要是显示的字符串 void Dialog::criticalMessage() { QMessageBox::StandardButton reply; reply QMessageBox::critical…

【spider】Tesseract机器视觉实现验证码识别

本文将重点介绍机器视觉的一个分支&#xff1a;文字识别&#xff0c; 介绍如何用一些 Python库来识别和使用在线图片中的文字 我们可以很轻松的阅读图片里的文字&#xff0c;但是机器阅读这些图片就会非常困难&#xff0c;利用这种人类用户可以正常读取但是大多数机器人都没法…

初识MVC

好多次听见别人说MVC&#xff0c;那么MVC到底是什么呢&#xff1f;今天来一探到底&#xff0c;揭开其神奇面纱。。 MVC介绍&#xff1a; MVC全名Model View Controller&#xff0c;是模型&#xff08;Model&#xff09;-视图&#xff08;View&#xff09;-控制器&#xff08;Co…

【spider】selenium模拟点击斗鱼示例

from selenium import webdriver import timeurl https://www.douyu.com/directory/all# 动态html网页加载可能出现的问题&#xff1a;element is not attached to the page document # 标签没有及时的加载显示出来&#xff0c;如果加载时间不够&#xff0c;可能报错 # try e…

webpack简介

webpack是 前端资源模块化管理工具和打包工具&#xff1b;webpack本身只能识别模块引入&#xff0c;打包模块的功能&#xff1b;webpack能识别ES Moudule、common JS等模块规范一、现有模块系统1、CommonJS关键词&#xff1a;module.exports exports require特点&#xf…

【Python + Selenium】之JS定位总结

1、滚动条 driver.set_window_size(500,500) js "window.scrollTo(0,200)" #左&#xff1a;距左边横滚、右&#xff1a;距上边竖滚 driver.execute_script(js) 2、获取元素的值 button driver.find_element_by_css_selector("#su") #定位按钮 input…

BigDecimal类整除报错的解决方案

例如&#xff1a; BigDecimal num1 new BigDecimal("10"); BigDecimal num2 new BigDecimal("3"); BigDecimal num3 num1.divide(num2); 其实devide的函数定义如下 BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;…

NodeJS中的require和import

ES6标准发布后&#xff0c;module成为标准&#xff0c;标准的使用是以export指令导出接口&#xff0c;以import引入模块&#xff0c;但是在我们一贯的node模块中&#xff0c;我们采用的是CommonJS规范&#xff0c;使用require引入模块&#xff0c;使用module.exports导出接口。…

【selenium】selenium和requests登陆的区别

requests登陆 import requests import time t int(time.time()*1000) # 创建一个会话 s requests.Session() post_url http://account.chinaunix.net/login/login data {username: xxxxxxxxx,password: xxxxxxxxx,_token: nmSXhgHib8dTIC9DrATSkTzBBo4zz9eqDEPeG5i1,_t: t…

【spider】多线程爬虫

多线程工作原理 多线程示意图 Queue&#xff08;队列对象&#xff09; queue是python中的标准库&#xff0c;可以直接from queue import Queue引用;队列是线程间最常用的交换数据的形式 python下多线程的思考 对于资源&#xff0c;加锁是个重要的环节。Queue&#xff0c;是线…

css设置文字上下居中,一行文字居中,两行或多行文字同样居中。

HTML: <div class"book-detail-store-item align-center-vertical">居中文字</div> CSS: .book-detail-store-item {width: 50px&#xff1b;height&#xff1a;50px&#xff1b;line-height: 25px;font-size: 12px;}/*flex垂直居中对齐*/ .align-center…

MySQL/sqlserver查询in操作 查询结果按in集合顺序显示

2019独角兽企业重金招聘Python工程师标准>>> MySQL/sqlserver查询in操作 查询结果按in集合顺序显示 MySQL用下面的语句 select * from ibs6_terminal_adv_inf where id in (16,14,15) order by field(id,16,14,15) select * from ibs6_terminal_adv_inf where id in…