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请求头)来设置该参数。
原文地址:https://www.cnblogs.com/yj0405/p/14571651.html