第九单元 DRF框架及APIView

第九单元 DRF框架及APIView,第1张

这里写目录标题
    • ##9.1 基本概念##
      • 9.1.1 什么是前后端分离
      • 9.1.2 什么是restful风格
      • 9.1.3 什么是接口及接口文档
    • 9.2 DRF工程
      • 9.2.1 drf工程搭建
      • 9.2.2 drf官方文档导读
    • 9.3 APIView
      • 9.3.1 APIView处理Request
      • 9.3.2 视图的Response及json处理
    • 9.4 序列化
      • 9.4.1 什么是JSON
      • 9.4.2 什么是序列化
      • 9.4.4 DRF的序列化器
    • 在后端实现增删改查 *** 作

##9.1 基本概念## 9.1.1 什么是前后端分离
  • 前端:浏览器
    以炫酷、流畅、兼容为主
  • 后端:服务器
    三高: 高并发、高可用、高性能

不分离
用户在浏览器上发送请求,服务器端接收到请求,从数据库取出数据,处理后将结果数据填入 HTML 模板,返回给浏览器,浏览器将 HTML 展现给用户,不分离的核心就是模版

分离
数据渲染的工作在客户端浏览器,不需要服务端完成,服务端专注于提供数据
那么这就要求Django框架不需要返回一个模版页面,而是返回一套JSON数据,而由于JSON可以在多种语言中支持,是一种交互、兼容非常合适的语言格式,所以现在后台常返回的数据都为JSON格式的,这个过程也称作序列化

9.1.2 什么是restful风格

在前后端分离的应用模式里,API接口如何定义?

  • POST /add-goods 增加商品
  • POST /delete-goods 删除商品
  • POST /update-goods 修改商品
  • GET /get-goods查询商品信息

使用合理的请求方式

  • GET:获取数据
  • POST:提交数据,创建数据
  • PUT:提交数据,更新数据
  • DELETE:删除数据

使用合理的状态码
接口返回数据,还要带上合理的状态码进行标记

200 OK - [GET]		# 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH]	# 用户新建或修改数据成功。
202 Accepted - [*]	# 表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]	# 用户删除数据成功。
9.1.3 什么是接口及接口文档


API接口文档一般分为接口描述、接口地址、请求方法、请求参数、响应内容、错误代码、实例

9.2 DRF工程 9.2.1 drf工程搭建

安装DRF框架

pip install djangorestframework -i 
https://pypi.tuna.tsinghua.edu.cn/simple

配置 settings

INSTALLED_APPS = [
  ...
  'rest_framework',  # 配置DRF框架
]
9.2.2 drf官方文档导读
  • 将请求的数据转换为模型类对象 反序列化
  • *** 作数据库
  • 将模型类对象转换为响应的数据如JSON格式 序列化
  • 视图封装:DRF统一封装了请求的数据为request.data以及返回数据的Response方法
  • 序列化器:DRF提供了序列化器可以统一便捷的进行序列化及反序列化工作
9.3 APIView 9.3.1 APIView处理Request

.data
DRFrequest.POSTrequest.FILES的数据统一封装到了data属性中,其中包含了

  • 解析之后的文件、非文件数据
  • POSTPUTPATCH请求方式解析后的数据
  • 表单类型数据、JSON类型数据
from rest_framework.views import APIVie
from rest_framework.response import Response

class MyView(APIView):
    def post(self,request):
        # request.data.get('id')
        print(request.data)
        return Response({'msg': 'success'}, status=201)

.query_params
DRF为了更准确的表示这是从连接里取得数据,从而把request.GET的名字更换为了request.query_params,其余 *** 作与request.GET一样,这里只是拼写更换

from rest_framework.views import APIVie
from rest_framework.response import Response

class MyView(APIView):
    def get(self,request):
        # request.query_params.get('id')
        print(request.query_params)  # get 的连接传参
        return Response({'msg': 'success'}, status=200)
9.3.2 视图的Response及json处理

目前在DRF中,我们所使用最多的就是Response这个方法,经常使用已经序列化好的数据结合Response返回

9.4 序列化 9.4.1 什么是JSON

这一种在各个编程语言中流通的数据格式,可以在不同的编程语言中的进行数据传递和交互

也就是用JSON传输数据可以让不同语言之间可以跨越语言不同的鸿沟,虽然 python 无法和 js 进行通信,但是通过JSON,就可以让两者进行数据通信

9.4.2 什么是序列化

序列化:就是把模型层的数据返回为JSON**数据集

反序列化:就是把前端发来的JSON**数据,类字典数据,变为模型层的数据

9.4.4 DRF的序列化器

在根目录下创建serializers文件写

# DRF的序列化器文件
# 创建自己的序列化器---写模型类一样
from rest_framework import serializers

# 普通序列化器
# 定义序列化器的名字
class PeopleSerializer(serializers.Serializer):
    # 模型类有哪些字段就序列化哪些字段
    # id = serializers.IntegerField()
    name =serializers.CharField(max_length=20)
    sex =serializers.CharField(max_length=20)
    money =serializers.IntegerField()
    ranking =serializers.IntegerField()

1.增删查改对应几个 *** 作?

5个,增加一个数据post,删除一个数据delete,查询所有数据get,查询一个数据get,修改一个数据put。

2.那些 *** 作需要参数,那些 *** 作不需要参数?

不需要参数: 增加一个数据post,查询所有数据get 静态路由

需要参数:删除一个数据delete,查询一个数据get,修改一个数据put 带id的动态路由

3.需要设计几个类视图实现?

2个

知识点:

1.普通序列化器 和 模型序列化器

2.序列化器的使用,怎么进行增删查改。

3.增删查改序列化对应哪些 *** 作,反序列化对应的哪些 *** 作

序列化:查

反序列化:增、改

删除都不是

在后端实现增删改查 *** 作

views中实现

from django.shortcuts import render
# 导入 APIView导包
from rest_framework.views import APIView
# 导入视图 Response
from rest_framework.response import Response
# 导入模型类 People
from myapp.models import People
# 导入普通序列化器
from myapp.serializers import PeopleSerializer,PeopleSerializer2
# Create your views here.

class PeopleView(APIView):
    # # 查询所有名人信息
    # def get(self,request):
    #     people = People.objects.all()
    #     people_list = []    # 手动完成序列化的过程
    #     for peo in people:    # 将这个数据做一个重组
    #         people_dict = {
    #             'name': peo.name,
    #             'sex': peo.sex,
    #             'money': peo.money,
    #             'ranking': peo.ranking
    #         }
    #         people_list.append(people_dict)
    #     return Response(people_list, status=200)


    # 使用序列化器
    # 展示数据
    def get(self,request):
        people = People.objects.all()
        # people 是要序列化的数据,many=True多个数据
        # 使用序列化器对数据进行序列化
        ser = PeopleSerializer(people, many=True)   # 序列化
        #  注意:返回响应返回的是.data字段
        return Response(ser.data, status=200)


    # 增加一个信息  是反序列化  json数据->ORM格式数据
    def post(self,request):
        # 使用序列化器进行反序列化
        ser = PeopleSerializer(data=request.data)
        # 判断反序列化是否成功
        # raise_exception=True  如果出现异常,会抛出异常
        if ser.is_valid(raise_exception=True):
            # 保存
            ser.save()
            # 201添加 或者 修改成功
            return Response({'msg': 'success'}, status=201)
        # 返回失败
        return Response({'msg': 'error'}, status=400)



class PeopleView2(APIView):
    # 查询一个信息
    def get(self, request, id):
        try:
            peo_data = People.objects.get(id=id)
        except Exception as e:
            print(e)
            # 404 数据不存在
            return Response({'msg': 'error'}, status=404)
        # 对ORM *** 作查询到的数据进行 序列化
        ser = PeopleSerializer(instance=peo_data)
        return Response(ser.data, status=200)

    # 修改一个信息
    def put(self, request, id):
        try:
            peo_data = People.objects.get(id=id)
        except Exception as e:
            print(e)
            # 404 数据不存在
            return Response({'msg': 'error'}, status=404)
        # 对要更新的数据进行 反序列化
        # instance=peo_data,要修改的ORM对象(实例)
        # data=request.data, 用于修改ORM对象的数据
        ser = PeopleSerializer(instance=peo_data,data=request.data)
        # 判断反序列化是否成功
        if ser.is_valid(raise_exception=True):
            # 保存
            ser.save()
            # 201 添加/修改 成功
            return Response({'msg': 'success'}, status=201)
        return Response({'msg': 'error'}, status=500)


    # 删除一个信息
    def delete(self, request, id):
        try:
            People.objects.filter(id=id).delete()
        except Exception as e:
            print(e)
            # 404 数据不存在
            return Response({'msg': 'error'}, status=404)
        # 204 删除成功
        return Response({'msg': 'success'}, status=204)

serializers中实现普通序列化器

# DRF的序列化器文件
from rest_framework import serializers
# 把模型类导入进来
from myapp.models import People

# 普通序列化器
# 定义序列化器的名字
class PeopleSerializer(serializers.Serializer):
    # 模型类有哪些字段就序列化哪些字段
    # id = serializers.IntegerField()
    name =serializers.CharField(max_length=20)
    sex =serializers.CharField(max_length=20)
    money =serializers.IntegerField()
    ranking =serializers.IntegerField()

    # 新增数据会调用create方法
    def create(self, validated_data):
        obj = People.objects.create(
            # ** 对 validated_data 做一个拆包 *** 作
            **validated_data
        )
        # 或
        # People.objects.create(
        #     name=validated_data.get('name'),
        #     sex = validated_data.get('sex'),
        #     money = validated_data.get('money'),
        #     ranking = validated_data.get('ranking'),
        # )
        # 返回新生成的ORM对象
        return obj

    # 修改数据需要实现update方法
    # instance,要修改的ORM对象(实例)
    # validated_data, 用于修改ORM对象的数据
    def update(self, instance, validated_data):
        instance.name = validated_data.get('name')
        instance.sex = validated_data.get('sex')
        instance.money = validated_data.get('money')
        instance.ranking = validated_data.get('ranking')
        instance.save()
        # 返回修改后的ORM对象
        return instance

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/877840.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存