3. DRF中 request请求组件和response响应组件
本节内容
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')), ]
客户端发送的是非json数据格式,那么request.data得到的是querydict,<QueryDict: {'username': ['chao'], 'password': ['123']}>
客户端发送的是json数据 那么rrequest.data获得的是 {'a': 'aa', 'b': 'bb'} -- 普通字典数据
无论前端发送的哪种格式的数据,我们都可以以统一的方式读取数据。
1).data
request.data
返回解析之后的请求体数据。类似于Django中标准的request.POST
和 request.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'})
Response(data, status=None, template_name=None, headers=None, content_type=None)
-
data
: 为响应准备的序列化处理后的数据; -
status
return Response({'msg': 'ok'},status=204) #直接写数字形式的 204等等这些数字代表什么,其实在drf中有文本形式的写法,在下面的文件中可以看到 from rest_framework import status #点击查看status就能看到了 return Response({'msg': 'ok'},status=status.HTTP_204_NO_CONTENT) #这样写也可以,文本形式