zoukankan      html  css  js  c++  java
  • 3. DRF中 request请求组件和response响应组件

    本节内容

      一 、DRF视图功能介绍

      二 、drf中请求和响应简单使用

      三 、请求与响应

        3.1 Request

        3.2 、Request 常用属性

        3.3  Response 参数说明

     

    一 、DRF视图功能介绍

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

    Django REST framwork 提供的视图的主要作用:

    • 控制序列化器的执行(检验、保存、转换数据)

    • 控制数据库查询的执行

    • 调用请求类和响应类[这两个类也是由drf帮我们再次扩展了一些功能类。]

    为了方便我们学习,所以先创建一个子应用req

    python manage.py startapp req

    二 、drf中请求和响应简单使用

     view.py

    from django.shortcuts import render,HttpResponse
    from django.views import View
    
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import status
    
    # Response 响应组件(返回一个调试接口的html页面,还能返回json数据)
    from django.http import JsonResponse
    class StudentsView(APIView):
        #class StudentAPIView(View):  #之前的写法
        def get(self,request):
            #     request.POST
            #     request.body -- 加工
                #request.data  # 能够获取post请求提交过来的数据
            # 如果客户端发送过来的是json数据,那么request.data能够直接获取到加工之后的数据,是个字典数据
            # 如果先获取url中携带的查询参数
            # request.query_params --等同-- request.GET
            # 老request对象 是 WSIGRequest对象
            #
            # print(request._request) # 老的
            # print(request)  # 新的
            a = {'name':'chao'}
    
            # return HttpResponse('ok')
            return Response(a,status=status.HTTP_201_CREATED,headers={'a':'b'})
    
            # return JsonResponse(a)
        def post(self,request):
            # print(request.path) #/req/students/
            # print(request.query_params) <QueryDict: {'a': ['1'], 'b': ['2']}>
            # print(request.GET) <QueryDict: {'a': ['1'], 'b': ['2']}>
    
            # print(request.data)
            # 客户端发送的是非json数据格式,那么得到的是querydict,<QueryDict: {'username': ['chao'], 'password': ['123']}>
            # 客户端发送的是json数据 那么获得的是 {'a': 'aa', 'b': 'bb'} -- 普通字典数据
    
            return HttpResponse('post ok')    

    urls.py

    from django.urls import path
    from . import views
    urlpatterns = [
        path(r'students/',views.StudentView.as_view()),
    
    ]

    总路由中:

    from django.contrib import admin
    from django.urls import path,include
    
    urlpatterns = [
        ...
        path('req/',include('req.urls')),
    ]

    三 、请求与响应

    3.1 Request

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

    REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典[QueryDict]对象保存到Request对象中。这里我们可以自行写一个接口测试一下django原来的模式是解析不了json数据的,drf可以解析;

    客户端发送的是非json数据格式,那么request.data得到的是querydict,<QueryDict: {'username': ['chao'], 'password': ['123']}>
    客户端发送的是json数据 那么rrequest.data获得的是 {'a': 'aa', 'b': 'bb'} -- 普通字典数据
    无论前端发送的哪种格式的数据,我们都可以以统一的方式读取数据。

    3.2 、Request 常用属性

    1).data

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

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

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

    • 利用了REST framework的parsers解析器,不仅支持表单类型数据(urlencoded,form-data),也支持JSON数据(application/json)

    2).query_params

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

    from django.shortcuts import render
    
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    class StudentAPIView(APIView):
        def get(self,request):
            print(request)
    
            #获取url中的请求参数
            #当我们访问http://127.0.0.1:8001/req/students/?age=100
            print(request.query_params) # <QueryDict: {'age': ['100']}>
            return Response({'msg': 'ok'})
    
        def post(self,request):
            # 获取post请求体中的数据
            print(request.data)
            print(request.data.get('hobby'))
            print(request.data.getlist('hobby'))
            '''
            结果:
                <QueryDict: {'name': ['小黑'], 'hobby': ['篮球', '美女']}>
                美女
                ['篮球', '美女']
            '''
            return Response({'msg':'ok'})
    示例

    3.3  Response 参数说明

    Response(data, status=None, template_name=None, headers=None, content_type=None)

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

    data不能是复杂结构的数据,如Django的模型类对象,对于这样的数据我们可以使用Serializer序列化器序列化处理后(转为了Python字典类型)再传递给data参数。

    参数说明:

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

    • status: 状态码,默认200;

    return Response({'msg': 'ok'},status=204) #直接写数字形式的
    204等等这些数字代表什么,其实在drf中有文本形式的写法,在下面的文件中可以看到
    from rest_framework import status  #点击查看status就能看到了
    return Response({'msg': 'ok'},status=status.HTTP_204_NO_CONTENT) #这样写也可以,文本形式
    • template_name: 模板名称,如果使用HTMLRenderer 时需指明;就是有些人觉得Response返回的那个页面丑,那么就可以通过这个模板自行定制。
    • headers: 用于存放响应头信息的字典;比如放一些cookie啊或者一些自定制的响应头啊都可以,例如:return Response({'msg': 'ok'},status=204,headers={'xx':'oo'})
    • content_type: 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据(accept请求头)来设置该参数。
  • 相关阅读:
    刷题-力扣-剑指 Offer 22. 链表中倒数第k个节点
    刷题-力扣-617. 合并二叉树
    刷题-力扣-1109. 航班预订统计
    刷题-力扣-606. 根据二叉树创建字符串
    刷题-力扣-563. 二叉树的坡度
    扛把子组20191017-8 alpha week 2/2 Scrum立会报告+燃尽图 07
    20191017-7 alpha week 2/2 Scrum立会报告+燃尽图 06
    20191017-6alpha week 2/2 Scrum立会报告+燃尽图 05
    扛把子组20191017-5 alpha week 2/2 Scrum立会报告+燃尽图 04
    记第一次 团建
  • 原文地址:https://www.cnblogs.com/yj0405/p/14571651.html
Copyright © 2011-2022 走看看