【Django视图(View与APIView)】

时间:2023-02-05 17:55:24

介绍

1.继承django的View
2.APIView和View的不同之处:
a.传入到view方法中的是​​Request​​对象,而不是django的​​HttpRequest​​对象
b.view方法可以返回​​Response​​对象,会把响应数据处理为符合前端要求的数据格式
c.任何​​APIException​​异常都会被捕获到,并且处理成合适的响应信息
d.再进行​​dispatch()​​分发前,会对请求进行身份认证、权限检查、流量控制
3.常用的类属性
a.​​authentication_classes​​:身份认证类,列表或元组
b.​​permlssoln_classes​​:权限检查类,列表或元组
c.​​throttle_classes​​:流量控制类,列表或元组

请求处理的优化(继承​​APIView​​,使用它的​​request​​)

  • 痛点:在之前所写的原始django代码中,只能接收json类型的参数,不能接收比如form表单格式的参数,否则会报错500
  • 解决
    1.导入from rest_framework.views import APIView类,并且视图类继承APIView,并使用APIViewrequest
    2.不管传来的是json,还是form表单,都可以通过request.data来进行获取其中的内容。所以,之前代码中对前端传来的参数的解码等操作,就没必要进行了
    3.只需要在View类继承APIView即可,其它的操作照旧(对json的解码等操作可省略)
  • 继承了APIView对象后的Request
    1.它是对django的HttpRequest对象的拓展,会对请求数据中的请求头中Content-Type的内容进行判断并处理,所以,不管前端发送什么数据类型的数据,都可以用request.data进行获取到
    2.支持Django.request的所有对象和方法
  • ​request.data​​ 1.类似django的request.POSTrequest.FILES,可以对post/put/patch的请求数据进行解析,并获取到请求数据的主体内容(dict类型)。并且支持json、form等格式的请求数据
    2.序列化示例:serializer = ProjectSerializer(data=request.data)
  • ​request.query_params​​ 类似django的request.GET,可获取get请求的参数

响应数据的优化(继承​​APIView​​,使用它的​​response​​)

  • 痛点:在之前所写的原始django代码中,只能返回json类型的数据,不能返回比如html、xml等类型
  • 解决
    1.使用APIViewResponse
    2.返回序列化后的数据,示例:return Response(serialize.data)
  • ​APIView​​的Response
    1.对django的HttpResponse进行了拓展,可以返回json、html、xml等格式的数据
    2.根据请求头的Accept,自动转化响应数据为对应的数据格式,并返回响应
    3.如果请求头中没有设置Accept就会采用默认方法对响应数据进行处理,默认是返回json格式(可能有bug?)
    4.如果不想默认,那么可以设置默认的响应渲染格式:
    a.到项目/setting.py中指定默认渲染类

【Django视图(View与APIView)】

b.可浏览的API视图(rest framework自带的):
在​​urls.py​​的路由设置中,设置

【Django视图(View与APIView)】

  • 详解​​Response(data, status=None, template_name=None, headers=None,content_type=None )​​ 1.data:值是序列化处理后的数据,一般是serializer.data(数据类型为python的基础数据类型:字典/嵌套字典/嵌套字典的列表)
    2.status:状态吗,默认200
    3.template_name:想要返回的html模版的名称,使用HTMLRenderer渲染时需要指明
    4.headers:用于存放响应信息头,dict
    5.content_type:响应头的Content-Type,通常此参数无需设置,会自动根据前端所需要类型来设置该参数(比如前端设置Accpet:text/html,那么就会返回html页面给前端)
  • ​status​​的常量可以在​​from rest_framework import status​​查看

DRF自带的api浏览页面

  • 在​​urls.py​​中,添加以下path,然后进行访问即可

【Django视图(View与APIView)】

View与APIView的区别

View是Django默认的视图基类,APIView是REST framework提供的所有视图的基类, 继承自Django的View,对Django中的View进行了拓展,具备了认证、授权、限流、不同请求数据的解析的功能。

1.传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;

a.统一使用Request对象.data属性去获取json格式的参数、form表单参数、FILES
b、使用Request对象.query_params来获取查询字符串参数
c、Django支持的参数获取方式,DRF都支持

  • .GET --> 查询字符串参数 --> .query_params
  • .POST --> x-www-form-encoded
  • .body --> 获取请求体参数

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

a.对Django中的HttpResponse进行了拓展
b.实现了根据请求头中Accept参数来动态返回
c.默认情况下,如果不传Accept参数或者传参为application/json,那么会返回json格式的数据

  • 1.可以在全局配置settings中修改默认的渲染类(处理返回的数据形式)
  • 2.列表中的元素是有优先级的,第一个元素优先级最高

【Django视图(View与APIView)】

d.如果Accept参数为text/html,那么会返回可浏览的api页面(html页面)
e.Response第一个参数为,经过序列化之后的数据(往往需要使用序列化器对象.data)
f.status指定响应状态码

3.在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。

【Django视图(View与APIView)】

实现

django的View

先使用django自带的view,获取一个Card表里面的卡号信息:
models.py设计card表

【Django视图(View与APIView)】

views.py视图的编写

【Django视图(View与APIView)】

urls.py设置访问地址

【Django视图(View与APIView)】

REST framework的APIView

REST framework的APIView继承了django的View类,先序列化Card类,这里的序列化用rest_framework里面的ModelSerializer

【Django视图(View与APIView)】

配置urls.py,设置访问地址

【Django视图(View与APIView)】