测试开发-rest_FrameWork入门

djangorestframework运行原理


相比于原生django开发的web应用,多了一层序列化器(Serializer),如果用过Django表单(Form),应该
会对其原理有所了解,序列化器和表单都是基于Field进行字段验证,而Field都来自于
rest_framework.fields模块,相当于把django的封装了一层。

DRF基本组件-Serializer

序列化(Serializer)是 DRF 的核心概念,提供了数据的验证和渲染功能,其工作方式类似于 Django Form
Serializer的作用是实现序列化和反序列化
所谓序列化就是将python数据对象转化成方便传输的文本格式,如:json/xml等
反序列化就是将这个过程反过来。
和models类似,序列化通常定义在应用程序下单独文件中serializer.py
如果采用了DRF模式开发django,那么model将直接和serializer交互。

安装djangorestframework
pip install djangorestframework
配置djangorestframework
INSTALLED_APPS = [
    ...
    'rest_framework',
]

序列化与反序列化

1.模型改造,添加元类 Meta
class Meta:  # 模型元类的作用:为模型增加额外的信息,如模型对应表名,
  ordering = ['id']  # 数据根据ID排序
  db_table = ['reqquest']  # 模型对应的数据库表名,不设置则默认为app名_模型名
2.创建1个序列化类
# 序列化器作用是转化json为模型对象,或者转化模型对象为json对象
# 序列化器是针对数据模型,一个序列化器对应一个模型
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer

from sqtp.models import Case, Config, Step, Request


class RequestSerializer(serializers.Serializer):
    def update(self, instance, validated_data):
        """
    根据提供的验证过的数据创建并返回一个新的`Snippet`实例。
    """
        instance.step = validated_data.get('step', instance.step)
        instance.method = validated_data.get('method', instance.method)
        instance.url = validated_data.get('url', instance.url)
        instance.params = validated_data.get('params', instance.params)
        instance.headers = validated_data.get('headers', instance.headers)
        instance.cookies = validated_data.get('cookies', instance.cookies)
        instance.data = validated_data.get('data', instance.data)
        instance.json = validated_data.get('json', instance.json)

    method_choices = (  # method可选字段,二维元组
        (0, 'GET'),  # 参数1:保存在数据库中的值,参数2:对外显示的值
        (1, 'POST'),
        (2, 'PUT'),
        (3, 'DELETE'),
    )
    step = serializers.RelatedField(queryset=Step.objects.all(), allow_null=True)
    method = serializers.ChoiceField(choices=method_choices, default=0)
    url = serializers.CharField()
    params = serializers.JSONField(allow_null=True)
    headers = serializers.JSONField(allow_null=True)
    cookies = serializers.JSONField(allow_null=True)
    data = serializers.JSONField(allow_null=True)
    json = serializers.JSONField(allow_null=True)

    def create(self, validated_data):
        """
        根据提供的验证过的数据创建并返回一个新的`Snippet`实例。
        """
        return Request.objects.create(**validated_data)
3.使用序列化类
"""
@author: haiwen
@date: 2021/10/23
@file: test_serializers.py
"""
from django.test import TestCase
from sqtp.models import Step, Request
from sqtp.serializers import RequestSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser

class TestRequestSerializer(TestCase):
    req1 = Request.objects.create(method=1,url='/mgr/teacher1/',data={"name":"小刚","age":18,"address":"beijing"})
    # 序列化1:数据对象转化成python原生数据类型
    req1_serializer = RequestSerializer(req1)
    print(req1_serializer.data)  # 序列化后的数据存储于序列化对象的data属性中
    # 序列化2: python原生数据类型转化为Json
    content =JSONRenderer().render(req1_serializer.data)
    print(content)

    # 反序列化1: 将数据流解析为Python原生数据类型
    import io
    steam = io.BytesIO(content)  #构建一个steam流
    data = JSONParser().parse(steam) # 转化成python原生数据类型
    print(data)
    # 反序列化2: python原生数据转化成模型对象实例
    serializer = RequestSerializer(data=data) #构建序列化器
    if serializer.is_valid(): #校验入参是否合法
        print(serializer.validated_data) # 校验之后的数据
        serializer.save()               # 保存数据对象

    # 序列化器返回完整结果集
    serializer = RequestSerializer(Request.objects.all(),many=True)
    print(serializer.data)  #

    # 序列化器内部代码
    print(repr(serializer))
posted @ 2022-07-19 22:17  曹_小_伟  阅读(89)  评论(0)    收藏  举报