【Django学习笔记 - 18】:drf请求响应简介、基类(APIView、GenericAPIView)、mixin扩展类与三级视图、视图集与路由

简介: 【Django学习笔记 - 18】:drf请求响应简介、基类(APIView、GenericAPIView)、mixin扩展类与三级视图、视图集与路由

drf请求响应简介


请求Request


在DjangoViews中,每定义一个视图,都会传入一个默认的HttpRequest对象,这个HttpRequest对象由Django为我们创建。


REST Framework传入视图的request对象就不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。


REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典对象保存到Request对象中。


Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。无论前端发送的哪种格式的数据,我们都可以以统一的方式进行读取。




常用属性


   Data


   Request.data返回解析之后的请求体数据。类似于Django中标准的request.POST和request.FILES属性,但提供的如下特性:


       包含了解析之后的文件和非文件数据


       包含了POST、PUT、PATCH请求方式解析后的数据


       利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据


   query_params(查询字符串)

   request.query_params与标准的request.GET相同,只是更换了更准确的名称而已。




响应Response


此处的响应就不再是django中的HttpResponse对象了,而是由REST

framework提供的一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(渲染)成符合前端需求的类型(JSON,XML)。


RESTframework提供了Renderer渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换相应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理相应数据,我们可以通过配置来修改默认响应格式。



构造方式

from rest_framework.response import Response
Response(data, status=None, template_name=None, headers=None, content_type=None)

注意:


   data数据不要是render处理之后的数据,只需传递python的内建类型数据即可,REST framework会使用renderer渲染器来处理data


   Data不能是复杂结构的数据,例如Django的模型类对象,对于模型类对象的话,可以使用序列化器来进行序列化处理之后再传递给data参数。




参数说明


Data:为响应准备的序列化处理后的数据;


Status:状态码,默认为200;


Template_name:模板名称,如果使用HTMLRenderer时需要指明;


Headers:用于存放响应头信息的字典;


Content_type:响应数据的Content_type,通常此参数无需传递,REST framework会根据前端所需类型数据类设置该参数。



Response常用属性


  1. Data传给response对象的序列化器后,但还没有经过render处理的数据


  1. status_code
    状态码


  1. Content
    经过render处理后的响应数据



基类


REST Framework为我们提供了视图的基类,继承于django的View父类。其位于rest_framework.views中


APIView的使用


   APIView类


   位置:rest_framework.views.APIView

   APIView是REST Framework提供的所有视图的基类,继承于Django的View父类。


   APIView与View的不同之处:

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


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


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


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


使用案例


案例一:查看drf的结构

先创建一个子应用

4cff5a422f444ad29ca2323e0113002b.png


  • 在自应用的views.py文件中导入APIView并写上函数

导入模块:


from rest_framework.views import APIView


from rest_framework.response import Response

class HusbandAPIView(APIView):
    def get(self, request):
        data = request.data
        print(data)
        print(type(data))
        return Response({'message':'请求处理成功'})



配置路由

bac4e0e6840541c881367a9403e86714.png


276e12c3bd504b44b510ddd8ba2d8d80.png

运行项目,在网页中可看到drf的结构

5090354839274ea9b2333b63836f1c00.png

1b4d1501632d4498a2e1634da7ed54f6.png

fade1efc4fc84840989f36eb8974456b.png


案例二:使用post请求获取表单和非表单数据


  1. 写上post方法


045695541e7a4d1c8fbba5a705383d9b.png


使用Postman发送表单请求

e20ed875048a4b7086385198447c7de7.png

bbbcb2bb3ae64b43a029fd78488756b2.png

e6fd72f22ace4c7ba5b7f912bb7cd812.png

dd3e91c0261748c2898889830900ef51.png



接收非表单的数据

778e2705f5d84c8faf4209fb0346666c.png

698cebd082f944a49a57f197bd23df3a.png


案例三:使用get方法获取查询字符串

82ab792ce05f4de389c276c3d9aea673.png1f2a921931cc4b7e99c8729457804f21.png

e0b8a16f004e4dca8fb5ad574539a123.png


相关文章
|
2月前
|
Python API 网络架构
Django实践-10RESTful架构和DRF入门
Django实践-10RESTful架构和DRF入门
Django实践-10RESTful架构和DRF入门
|
2月前
|
XML 前端开发 JavaScript
Python 教程之 Django(5)视图基础
Python 教程之 Django(5)视图基础
29 1
|
1月前
|
前端开发 数据库 Python
使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
【1月更文挑战第13天】使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
46 7
|
29天前
|
Shell 数据库 Python
Python 教程之 Django(6)视图类型
Python 教程之 Django(6)视图类型
12 0
Python 教程之 Django(6)视图类型
|
29天前
|
XML 前端开发 JavaScript
Python 教程之 Django(5)视图基础
Python 教程之 Django(5)视图基础
16 1
Python 教程之 Django(5)视图基础
|
1月前
|
缓存 开发者 Python
Django 视图层
Django 视图层
43 0
|
2月前
|
JSON 前端开发 JavaScript
Django实践-04静态资源和Ajax请求
Django实践-04静态资源和Ajax请求
Django实践-04静态资源和Ajax请求
|
2月前
|
Shell 数据库 Python
Python 教程之 Django(6)视图类型
Python 教程之 Django(6)视图类型
25 0
|
2月前
|
JavaScript Python
django和vue 请求403 FORBIDDEN怎么办
在请求头里,添加X-CSRFToken, 取自浏览器里的cookie 再附上取cookie的源码
22 0
|
2月前
|
Shell 数据库 Python
删除视图——基于函数的视图 Django
删除视图——基于函数的视图 Django
18 0

相关产品

  • 云迁移中心