我们之前的传入参数都是json格式,如果很多请求参数的格式都是form表单等格式需要怎么操作,之前的模式直接穿参数会报错:
我们需要解决既支持json
格式传入参数,又支持form
表单格式传入参数:所以引入了APIView
APIView介绍
DRF框架的视图的基类是 APIView
APIView的基本使用和View类似
Django
默认的View
请求对象是HttpRequest
,REST framework
的请求对象是Request
。
Request
对象的数据是自动根据前端发送数据的格式进行解析之后的结果。
HttpRequest.GET ————> Request.query_params
HttpRequest.POST 、HttpRequest.body————> Request.data
Django
默认的View
响应对象是HttpResponse
(以及子类),REST framework
的响应对象是Response
。
- 构造方式:
Response(data, status=None, template_name=None, headers=None, content_type=None)
-
参数说明:
-
List item
-
data
: 为响应准备的序列化处理后的数据; -
status
: 状态码,默认200; -
template_name
: 模板名称,如果使用HTMLRenderer时需指明; -
headers
: 用于存放响应头信息的字典; -
content_type
: 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数。
- 支持定义的属性:
authentication_classes
列表或元祖,身份认证类
permissoin_classes
列表或元祖,权限检查类
throttle_classes
列表或元祖,流量控制类。
具体使用步骤:
- 导入
APIView
from rest_framework.views import APIView
- 修改之前的继承
View
为APIView
;
class ProjectsList(APIView)`在这里插入代码片`
- . 去掉之前的穿入参数解析,直接使用
request.data
传入序列化器;
ser = ProjectsModelSerializer(data=request.data)
- 请求方法实例中,第二个参数
request
为Request
对象,是Django
中HTTPRequest
对象进行了扩展
- 修改
view.py
文件
import json
from django.http import JsonResponse, Http404
from rest_framework.response import Response
from rest_framework.views import APIView
from django.shortcuts import render
# Create your views here.
from django.views import View
from projects.models import Projects
from projects.serializer import ProjectsModelSerializer
class ProjectsList(APIView):
def get(self,request):# get请求中,就算用不上request,也需要设置这个参数
projects_qs = Projects.objects.all()
ser = ProjectsModelSerializer(instance=projects_qs,many=True)
return Response(ser.data,safe=False)
def post(self,request):
#新增项目
#
# json_data = request.body.decode('utf-8')
# python_data= json.loads(json_data,encoding='utf-8')
#反序列化,处理前端传入数据
ser = ProjectsModelSerializer(data=request.data)
try:
ser.is_valid(raise_exception=True)
except Exception as e:
return JsonResponse(ser.errors)
# project = Projects.objects.create(**ser.validated_data)
# #序列化,返回给前端数据
# ser = ProjectsSerializer(instance=project)
ser.save()
return Response(ser.data, safe=False)
class ProjectsDetail(APIView):
def get_object(self,pk):
try:
return Projects.objects.get(id = pk)
except Projects.DoesNotExist:
raise Http404
def get(self,request,pk):
"""
获取项目详情po00000000000000000
?
:param request:
:param pk: 项目ID
:return:
"""
#1.校验前端传递的pk(项目ID)
#2.获取项目ID
# project = Projects.objects.get(id=pk)
project = self.get_object(pk)
ser = ProjectsModelSerializer(instance=project)
#4.json格式返回
return Response(ser.data,status=200)
def put(self, request, pk):
# 1.校验前端传递的pk(项目ID),类型正整数,是否存在
# 2.获取指定id为pk的待修改项目
project = self.get_object(pk)
# json_data = request.body.decode('utf-8')
# python_data = json.loads(json_data, encoding='utf-8')
# 反序列化,处理前端传入数据
ser = ProjectsModelSerializer(data=request.data,instance=project)
try:
ser.is_valid(raise_exception=True)
except Exception as e:
return JsonResponse(ser.errors)
#
# # 4.更新项目
# project.name = ser.validated_data['name']
# project.leader = ser.validated_data['leader']
# project.tester = ser.validated_data['tester']
# project.programer = ser.validated_data['programer']
# project.publish_app = ser.validated_data['publish_app']
# project.desc = ser.validated_data['desc']
#
# # 保存
# project.save()
#
# ser = ProjectsSerializer(instance=project)
# 6.json格式返回
ser.save()
return Response(ser.data, status=201)
def delete(self,request,pk):
# 1.校验前端传递的pk(项目ID),类型正整数,是否存在
# 2.获取指定id为pk的待修改项目
project = self.get_object(pk)
project.delete()
return Response(None,safe=False,status=204)