两个基本类视图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相关推荐

  1. python drf_067.Python框架Django之DRF视图类

    一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...

  2. Drf从入门到精通四(Drf请求与响应、Drf能够解析的请求编码与响应编码、Drf视图、Drf视图基类)

    文章目录 一.Drf请求与响应 1.Request类和Response类 2.Drf能够解析的请求编码与相应编码 二.Drf视图组件 四.Drf视图基类 1.基于APIView写5个接口 2.基于Ge ...

  3. Django Rest_framework 4(APIView、GenericAPIView、ViewSet)

    详解Django DRF框架中APIView.GenericAPIView.ViewSet区别 https://zhuanlan.zhihu.com/p/72527077 View->APIVi ...

  4. DRF之View、APIView以及GenericAPIView

    一.APIView[基本视图类] 序列化后前端展示都是json数据,反序列化(post.put)也以json数据格式输入,这种用法存在很大的局限性,如果前端想以application/x-www-fo ...

  5. java中fitlter,068.Python框架Django之DRF视图集使用

    一 视图集与路由的使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...

  6. Django DRF 视图和常用功能

    DRF类 视图介绍 在DRF框架中提供了众多的通用视图基类和扩展类,用来简化视图的编写. View:Django默认的视图基类,负责将视图连接到URL,HTTP请求的基本调度. APIView: DR ...

  7. 第九单元 DRF框架及APIView

    1.前后端分离和不分离的概念 1.前后端分离: 1.1 前端:浏览器 HTML.CSS.Bootstrap.JS.JQuery.Vue.NodeJS.webpack 炫酷.流畅.兼容 后端:服务端 D ...

  8. FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类

    一. 概念 FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类 至于区别呢? 我觉得只是写法上的不一样, 实现的结果都 ...

  9. 框架、文档、视图类之间的调用关系

    在多文档MFC应用程序执行过程中,创建了多于一个的文档类.视图类.子框架类对象和一个主框架类.应用类对象.这些对象之间是通过一定的方式联系在一起的,在应用程序设计中,时常需要通过这些对象之间的关系来实 ...

最新文章

  1. 【Java】练习题:数字判断
  2. linux+bbu电池模块,服务器Raid卡电池自动充电
  3. 学习:ups电池放电时间是怎么计算的?
  4. html-初识表单post和get提交
  5. python实现队列_Python学习教程:用队列实现栈
  6. 【C语言】第七章 模块化与函数 题解
  7. 从Bayes角度理解Deep learning
  8. JS中的location.href
  9. 学习分布式技术,技术人看这里
  10. 全球首例无人车撞人致死事故判决:Uber无罪,安全员要进一步调查
  11. word 2016 for Mac 如何缩小编号与后面文字之间的缩进间隙
  12. python 列表生成式 字典生成式
  13. 超全蓝牙芯片原厂总结(含芯片型号)
  14. mysql msdtc 不支持_如何解决服务器上的msdtc不可用问题
  15. Android MeasureSpec解析
  16. 蓝鸽智慧计算机教室云服务平台操作说明,智慧教室操作说明.PDF
  17. java实验报告9 面向接口编程
  18. rnn--重新温习实现MNIST手写体识别
  19. 查找计算机网络方面文献正确检索,文献检索第二次计算机检索实习题目(2016.4.10)...
  20. 计算机产生背景和编程语言分类

热门文章

  1. VMware虚拟机安装windows8 时报错“Oxc000035a”解决办法
  2. 17 -> 详解 openWRT 的 gpio 配置关系说明
  3. 基于人工兔优化算法的函数寻优和工程优化
  4. Apollo学习(一)Apollo初学入门
  5. 使用头文件winbase.h的错误
  6. 关于电脑任务栏软件图标变成白色白纸的解决办法
  7. 用SendMessage/PostMessage发送WM_SIZE消息
  8. 浏览器无痕模式有什么作用,手机浏览器开启无痕模式的方法
  9. echarts饼图图例总结
  10. 关于 ideaIU 20191.2的基本安装教程及破解