APIView基本使用

1.什么是APIView

Django中视图views.py有两种一种是基于类的实现另一种是函数的实现,而APIView就是REST framework提供的所有视图的基类,继承了Django的View

2.APIView与View的区别

View是Django默认的视图基类,APIView是REST framework提供的所有视图基类并继承了Django的view

  APIView传入到视图方法中的是REST framework的Request对象而不是Django的HttpRequest对象

  视图方法可以返回REST framework的Response对象,视图会设置响应数据render符合前端要求的格式

  任何APIException异常都会被捕获到并处理成合适的响应信息

3.APIView+drf的Response

在用APIView视图类写的时候因为导入的drf是一个第三方app且只能在Django上使用所以不要忘了在settings.py文件中注册rest_framework这个app

from rest_framework.views import APIView
from rest_framework.response import Response
from res_framework.request import Requestclass BookView(APIView): # APIview继承Django的Viewdef get(self,request):# 获取所有数据book_list = Book.objects.all()# 定义空列表res_list = []
# book_list是queryset对象不能直接序列化 可以通过for循环一个个拼接成列表套字典的形式for book in book_list:res_list.append({'name':book.name,'price':book.price})return Response(res_list)

APIView源码分析

APIView的作用和Django的View作用差不多,APIView继承了View所以执行as_view时先走到APIView这个类中通过APIView里的dispatch进行一层封装对request这个对象进行了改变添加了3大认证(认证、权限、频率)可以来看看它的源代码:


  首先我们来看路由层,路由和View一样也是用了as_view()方法,但是我们在视图类中并没有写,所以用脚趾头想也知道了按住 command点击APIView中去查看

  再次调用到View中的as_view,在上一篇中已经查看过View的源码所以现在和View中的一样再调用dispatch方法但是我们视图层中没有定义所以也要在父类中查看:

总结:

1.只要继承APIView都没有csrf的认证

2.视图类中使用的request变成了dif提供的Request类的对象

3.执行视图类的方法之前,执行了3大认证(认证、权限、频率)

4.在执行三大认证和视图类的方法过程中只要报错都会被捕获处理

Request类源码分析

视图类中使用的request对象已经变成了drf提供的Request类的对象了,request已经不是原来的request了那么它还能像原来的request一样使用吗我们来通过Request的源代码进行分析:

  看了源代码可以知道和原来的request使用是一样的所以以后用的所有属性或方法直接用就可以

  新的request内部有原生的request request._request

  data是个方法被property装饰了变成了数据属性用

  urlencoded、form-data、json无论哪种格式都从request.data中取

  取文件依旧从request.FILES中取

  query_params:request.query_params 获取get请求提交的参数 等同于 request._request.GET与request.GET

序列化组件基本使用

序列化组件的使用类似于forms组件,也是定义一个序列化类然后序列化数据,比如获取book表中数据时:

'''新建一个py文件写序列化类'''
from .models import Book # 倒入book表
from rest_framework import serizlizers # 倒入需要继承的serializersclass BookSerializer(serizlizers.Serializer):name = serializers.CharFiels()price = serializers.CharField()

序列化写好后我们需要配路由然后在视图层来写具体功能获取表的多条数据

from rest_framework.view import APIView
from rest_framework.response import Response
from .serializer import BookSerializerclass BookView(APIView):def get(self, request):book_list = Book.object.all()ser = BookSerializer(instance=book_list, many=True)# instance表示要序列化的数据,many=True表示序列化多条默认是Falsereturn Response(ser.data)

获取表的单条数据,需要再穿个pk参数来指定

# 获取单条数据
class BookDetailView(APIView):def get(self.request,pk):book = Book.objects.filter(pk=pk).first()ser = BookSerializer(instance=book)return Response(ser.data)

反序列化

将前端传过来的数据反序列化成我的对象然后存到数据库里面,如对book表进行新增、修改:

class Bookview(APIview):def post(self,request):# 将前端传入的数据从data中取出ser = Bookserializer(data=request.data)# 对数据进行校验if ser.is_valid():# 校验通过数据保存ser.save()return Response(ser.data)else:    # 校验不通过返回错误信息return Response(ser.errors)class BookDetailView(APIView):def put(self,request,pk):ser = BookSerializer(data=request.data)if ser.is_valid():ser.save()return Response(ser.data)else:return Response(ser.errors)'''这样写会报错显示需要重写create方法和update方法'''

所有我们要在序列化类中再重写create方法,同理修改数据的时候也要重写一个update方法

'''新建一个py文件写序列化类'''
from .models import Book # 倒入book表
from rest_framework import serizlizers # 倒入需要继承的serializersclass BookSerializer(serizlizers.Serializer):name = serializers.CharFiels()price = serializers.CharField()# 重写新增方法def create(self,validated_data):# validated_data是校验过后的数据Book.objects.create(**validated_data)return res# 重写修改方法def update(self, instance, validated_data):# instance是要修改的数据instance.name = validated_data.get('name')instance.price = validated_data.get('price')instance.save()return instance

APIView与序列化组件使用相关推荐

  1. Rest Framework:序列化组件

    Django内置的serializers(把对象序列化成json字符串 from django.core import serializersdef test(request):book_list = ...

  2. drf3 Serializers 序列化组件

    为什么要用序列化组件 做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 给前端数据的时候都要转成json格式,那就需要对从数据库拿到的数据进行序列化. ...

  3. DAY97 - Rest Framework(二)- 序列化组件之Serializer和ModelSerializer

    一.序列化组件之Serializer from django.http import JsonResponse from rest_framework.views import APIView fro ...

  4. Rest Framework:二、序列化组件

    一.序列化组件 环境配置: 使django支持Mysql(前面已有介绍,这里不再重复) 使django支持 framework 在settings.py中的INSTALLED_APPS字段添加: &q ...

  5. Django框架(十九)—— drf:序列化组件(serializer)

    序列化组件 # 模型层 from django.db import modelsclass Book(models.Model): nid = models.AutoField(primary_key ...

  6. Django rest framework 序列化组件

    在笔者认为,在Django rest framework中最重要的是序列化组件,通过序列化我们可以将我们后台数据通过一定格式发送到我们的前端,然后通过一定的方法展示我们的数据. 那么我们就开始介绍我们 ...

  7. Django DRF认证组件/权限组件/序列化组件综合总结(完整版)

    本代码完成的功能是: 1.根据token判断用户登录状态,然后提示用户是否登陆, 2.用户登录后,根据用户类型判断用户是否有权限查看资料 使用rest_framework一定要在配置文件设置先设置 ' ...

  8. Django-rest-framework框架之APIView与序列化详解

    今日内容概要 基于APIView+Response写视图类 APIView的执行流程(源码分析) Request类的源码分析 验证不同编码格式提交数据(request.POST) 序列化类的序列化的使 ...

  9. Rest Framework第二天-序列化组件(下)、解析器

    序列化组件(下) 一.rest-framework序列化之ModelSerializer class BookSerializers(serializers.ModelSerializer):clas ...

最新文章

  1. Kubernetes对象模型
  2. 动感灯箱制作流程培训_向客户推荐灯箱,这16种灯箱你一定要知道
  3. 计算机二级考试字处理表格和文字分栏,Exce表格分栏打印输出的两种巧妙方法...
  4. vue 图形化设计工具_Vue: Vue-CLI3.0 创建项目
  5. CNCC2018 即将开幕,报名优惠截止倒计时5天!
  6. 【EMV L2】终端风险管理(Terminal Risk Management)
  7. Linux中级之keepalived配置
  8. 汇编语言程序设计实验——字符统计
  9. EXCEL透视后 调整列的顺序 如:1月 2月 3月 手动调整顺序
  10. type-c接口显示器方案
  11. 带有反爬虫机制下进行爬取数据方案,这里以阿里拍卖为例
  12. 第 11 章. Drawing Textures 绘制纹理
  13. 自动驾驶技术(2)--智能车辆导航技术概述
  14. k8s重启导致node没有成功连接:The connection to the server localhost:8080 was refused - did you specify the righ
  15. python制作图片_python制作斗图生成器
  16. python异常模块raise的概念以及基本用法
  17. Rx第三部分--深入序列
  18. Java规则引擎工作原理及其应用
  19. 为什么软件测试计划重要性,谈谈“测试计划”这点事
  20. crmeb 小程序包大小超过2M的解决方法

热门文章

  1. 【论文解读】HIN2Vec: Explore Meta-paths in Heterogeneous Information Networks for Representation Learning
  2. 移动硬盘盒芯片(SATAIII)
  3. WIN 11 无法正常运行HCL 模拟器
  4. 存储过程和存储函数的关系及使用方法
  5. 【BSP视频教程】STM32H7视频教程第1期:初识STM32H7准备工作,了解Cortex-M7内核及MDK,IAR,Embedded Studio,STM32CubeIDE和VS Code简单比较
  6. python求梅森尼数_梅森尼数
  7. 【IPD】IPDPLM
  8. 软件测试:接口测试流程
  9. 自定义组件中添加其他组件-1 83课 左边部分,右边部分的测试
  10. linux-FHS总结