DRF-视图类APIView与GenericAPIView
两个基本类视图APIView,GenericAPIView
APIView继承了Django中的view
权限指将来如果有注册用户的时候,是否有权限访问到我们的视图
认证是当发过来一个用户名和密码的时候,认证一下是否是我的注册用户
限流限制这个ip访问我服务的次数,主要用在反爬上。
GenericAPIView 继承了APIView,
分页功能
过滤排序
指定查询集(查询集有两个特点,惰性查询和缓存)
APIView的使用:
如果使用了rest_framework下面的视图,那么request和response对象就变了。
Request
post表单提交,data = request.data,查询的request.query_params
Rest framework传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework 提供的扩展HttpRequest类的对象。REST framework提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单)将请求数据进行parse解析,解析为类字典对象保存到Request对象中。
常用属性
1、.data
request.data返回解析之后的请求体数据,接收前端的数据
2、.query_params
request.query_params跟Django标准的request.GET相同。查询
Response
返回统一用Response就可以了。
代码如下,新建apiview_view.py
from django.shortcuts import render
from testdjango.models import BookInfo
from book_drf.serializer import BookSerializerfrom rest_framework.views import APIView
from rest_framework.request import Request
from rest_framework.response import Responseclass Books(APIView):def get(self, request):# 查询的时候print(request.query_params)books = BookInfo.objects.all()# 多个对象返回的时候需要加上many=Trueser = BookSerializer(books, many=True)return Response(ser.data)def post(self, request):# 1、获取请求数据# 2、验证请求数据# 3、保存数据# 4、返回结果# data = request.body.decode() #“{}”# data_dict = json.loads(data) # 转换成字典 {}# 使用rest_framework下面的view,request和response就发生了变化.post表单提交data = request.dataser = BookSerializer(data=data)ser.is_valid() # 验证方法,一旦调用这个is_valid()方法,就会调用序列化器里的数据内容是否符合要求,想看下验证结果# raise_exception=True 的含义是,一旦检出出错误,自动return,不用我们手写return# print(ser.validated_data) # validated_data 查看验证后的数据# return JsonResponse(ser.errors)# 视图通过save() 来调用serialzer序列化器里的crate()方法ser.save()# 这个ser.data 是序列化器里的create方法返回的对象,是这个对象里的datareturn Response(ser.data)class Book(APIView):def get(self, request, pk):book = BookInfo.objects.get(id=pk)ser = BookSerializer(book)return Response(ser.data)class BookDRFView(APIView):def put(self, request, pk):# 同保存一样的逻辑,前端数据都传给后端,只是在保存数据的时候,改为更新数据# 1、获取请求数据# 2、验证请求数据# 3、更新数据# 4、返回结果# data = request.body.decode()# data_dict = json.loads(data)data = request.data# 查询id的信息try:book = BookInfo.objects.get(id=pk)except:return Response({'error': '错误信息'}, status=400)# 更新的时候需要多传递一个对象,也就是将要更新的对象,和接收的对象都传递到序列化器中ser = BookSerializer(book, data)# 验证ser.is_valid()# 保存ser.save()# 4、返回数据return Response(ser.data)
在修改完视图方法后,还有修改路由
from django.conf.urls import url
from book_drf import views, apiview_viewurlpatterns = [url(r'^book_drf/$', apiview_view.Books.as_view()),url(r'^book_drf/(?P<pk>\d+)/$', apiview_view.Book.as_view()),url(r'^books_drf/(?P<pk>\d+)/$', apiview_view.BookDRFView.as_view()),
]
只是在接受数据和返回数据处做了变动,其余逻辑没有变。
GenericAPIView 的使用:
1、首先指定查询集
books = self.get_queryset() #获取查询集中的所有数据
2、指定当前类视图使用的序列化器
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
查询所有数据对象
books = self.get_queryset()
查询单一数据对象的使用方式
book = self.get_object()
获取序列化器
ser = self.get_serializer(books, many=True)
self.get_serializer(data=data)
代码如下:
from django.shortcuts import render
from testdjango.models import BookInfo
from book_drf.serializer import BookSerializerfrom rest_framework.generics import GenericAPIView
from rest_framework.request import Request
from rest_framework.response import Responseclass Books(GenericAPIView):queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据serializer_class = BookSerializer # 指定当前类视图使用的序列化器def get(self, request):# 查询的时候books = self.get_queryset() #获取查询集中的所有数据# 多个对象返回的时候需要加上many=Trueser = self.get_serializer(books, many=True) # 指定序列化器,获取序列化器对象return Response(ser.data)def post(self, request):# 1、获取请求数据# 2、验证请求数据# 3、保存数据# 4、返回结果# data = request.body.decode() #“{}”# data_dict = json.loads(data) # 转换成字典 {}# 使用rest_framework下面的view,request和response就发生了变化.post表单提交data = request.dataser = self.get_serializer(data=data) # 此处也是用self 获取get_serializer,指定序列化器,获取序列化器对象ser.is_valid() # 验证方法,一旦调用这个is_valid()方法,就会调用序列化器里的数据内容是否符合要求,想看下验证结果# raise_exception=True 的含义是,一旦检出出错误,自动return,不用我们手写return# print(ser.validated_data) # validated_data 查看验证后的数据# return JsonResponse(ser.errors)# 视图通过save() 来调用serialzer序列化器里的crate()方法ser.save()# 这个ser.data 是序列化器里的create方法返回的对象,是这个对象里的datareturn Response(ser.data)class Book(GenericAPIView):queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据serializer_class = BookSerializer # 指定当前类视图使用的序列化器def get(self, request, pk):book = self.get_object()ser = self.get_serializer(data=book)return Response(ser.data)class BookDRFView(GenericAPIView):queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据serializer_class = BookSerializer # 指定当前类视图使用的序列化器def put(self, request, pk):# 同保存一样的逻辑,前端数据都传给后端,只是在保存数据的时候,改为更新数据# 1、获取请求数据# 2、验证请求数据# 3、更新数据# 4、返回结果# data = request.body.decode()# data_dict = json.loads(data)data = request.data# 查询id的信息try:book = self.get_object() #从查询集中获取指定的单个数据对象,前端传递过来一个pk值,这个pk值从查询集里查询出来单个的对象except:return Response({'error': '错误信息'}, status=400)# 更新的时候需要多传递一个对象,也就是将要更新的对象,和接收的对象都传递到序列化器中ser = self.get_serializer(book, data=data)# 验证ser.is_valid()# 保存ser.save()# 4、返回数据return Response(ser.data)
GenericAPIView与APIView相比来看,没有减少代码量,但是与拓展类一起使用,就可以简化代码
DRF-视图类APIView与GenericAPIView相关推荐
- python drf_067.Python框架Django之DRF视图类
一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...
- Drf从入门到精通四(Drf请求与响应、Drf能够解析的请求编码与响应编码、Drf视图、Drf视图基类)
文章目录 一.Drf请求与响应 1.Request类和Response类 2.Drf能够解析的请求编码与相应编码 二.Drf视图组件 四.Drf视图基类 1.基于APIView写5个接口 2.基于Ge ...
- Django Rest_framework 4(APIView、GenericAPIView、ViewSet)
详解Django DRF框架中APIView.GenericAPIView.ViewSet区别 https://zhuanlan.zhihu.com/p/72527077 View->APIVi ...
- DRF之View、APIView以及GenericAPIView
一.APIView[基本视图类] 序列化后前端展示都是json数据,反序列化(post.put)也以json数据格式输入,这种用法存在很大的局限性,如果前端想以application/x-www-fo ...
- java中fitlter,068.Python框架Django之DRF视图集使用
一 视图集与路由的使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...
- Django DRF 视图和常用功能
DRF类 视图介绍 在DRF框架中提供了众多的通用视图基类和扩展类,用来简化视图的编写. View:Django默认的视图基类,负责将视图连接到URL,HTTP请求的基本调度. APIView: DR ...
- 第九单元 DRF框架及APIView
1.前后端分离和不分离的概念 1.前后端分离: 1.1 前端:浏览器 HTML.CSS.Bootstrap.JS.JQuery.Vue.NodeJS.webpack 炫酷.流畅.兼容 后端:服务端 D ...
- FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类
一. 概念 FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类 至于区别呢? 我觉得只是写法上的不一样, 实现的结果都 ...
- 框架、文档、视图类之间的调用关系
在多文档MFC应用程序执行过程中,创建了多于一个的文档类.视图类.子框架类对象和一个主框架类.应用类对象.这些对象之间是通过一定的方式联系在一起的,在应用程序设计中,时常需要通过这些对象之间的关系来实 ...
最新文章
- 【Java】练习题:数字判断
- linux+bbu电池模块,服务器Raid卡电池自动充电
- 学习:ups电池放电时间是怎么计算的?
- html-初识表单post和get提交
- python实现队列_Python学习教程:用队列实现栈
- 【C语言】第七章 模块化与函数 题解
- 从Bayes角度理解Deep learning
- JS中的location.href
- 学习分布式技术,技术人看这里
- 全球首例无人车撞人致死事故判决:Uber无罪,安全员要进一步调查
- word 2016 for Mac 如何缩小编号与后面文字之间的缩进间隙
- python 列表生成式 字典生成式
- 超全蓝牙芯片原厂总结(含芯片型号)
- mysql msdtc 不支持_如何解决服务器上的msdtc不可用问题
- Android MeasureSpec解析
- 蓝鸽智慧计算机教室云服务平台操作说明,智慧教室操作说明.PDF
- java实验报告9 面向接口编程
- rnn--重新温习实现MNIST手写体识别
- 查找计算机网络方面文献正确检索,文献检索第二次计算机检索实习题目(2016.4.10)...
- 计算机产生背景和编程语言分类
热门文章
- VMware虚拟机安装windows8 时报错“Oxc000035a”解决办法
- 17 -> 详解 openWRT 的 gpio 配置关系说明
- 基于人工兔优化算法的函数寻优和工程优化
- Apollo学习(一)Apollo初学入门
- 使用头文件winbase.h的错误
- 关于电脑任务栏软件图标变成白色白纸的解决办法
- 用SendMessage/PostMessage发送WM_SIZE消息
- 浏览器无痕模式有什么作用,手机浏览器开启无痕模式的方法
- echarts饼图图例总结
- 关于 ideaIU 20191.2的基本安装教程及破解