测试开发-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))

浙公网安备 33010602011771号