31.Django_framework_APIView

我们之前的传入参数都是json格式,如果很多请求参数的格式都是form表单等格式需要怎么操作,之前的模式直接穿参数会报错:
我们需要解决既支持json格式传入参数,又支持form表单格式传入参数:所以引入了APIView

APIView介绍

DRF框架的视图的基类是 APIView
APIView的基本使用和View类似

  1. Django默认的View请求对象是 HttpRequestREST framework 的请求对象是 Request
    Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。
HttpRequest.GET ————> Request.query_params
HttpRequest.POST 、HttpRequest.body————> Request.data
  1. 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会根据前端所需类型数据来设置该参数。

  1. 支持定义的属性:
    authentication_classes列表或元祖,身份认证类
    permissoin_classes列表或元祖,权限检查类
    throttle_classes列表或元祖,流量控制类。

具体使用步骤:

  1. 导入APIView
from rest_framework.views import APIView
  1. 修改之前的继承ViewAPIView
class ProjectsList(APIView)`在这里插入代码片`
  1. . 去掉之前的穿入参数解析,直接使用request.data传入序列化器;
ser = ProjectsModelSerializer(data=request.data)
  1. 请求方法实例中,第二个参数requestRequest对象,是DjangoHTTPRequest对象进行了扩展
  • 修改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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值