测试开发进阶(二十五)
欢迎关注我的公众号「测试游记」
痛点
- 代码冗余极其严重,不符合优秀测开风格
- 数据校验非常麻烦,且可复用性差
- 编码没有统一的规范,杂乱无章的感觉
- 写的代码非常多,不够简洁
- 仅支持json格式的传参,不支持form表单传参
- 仅能返回json格式的数据,其他类型不支持
- 列表页视图没有分页,过滤,排序功能
Django REST framework
- 在Django框架基础上,进行二次开发
- 用于构建Restful API
- 简称为DRF框架或REST freamwork框架
特性
- 提供了强大的Serializer序列化器,可以高效地进行序列化与反序列化操作
- 提供了丰富的类视图,Mixin扩展类,ViewSet视图集
- 提供了直观的Web API界面
- 多种身份认证和权限认证
- 强大的排序,过滤,分页,搜索,限流等功能
- 可扩展性,插件丰富
安装
| 1 | pip install djangorestframework | 
配置
LearnDjango/settings.py中添加'rest_framework'
| 1 | INSTALLED_APPS = [ | 
快速创建实例
新建projects/serializer.py
| 1 | from rest_framework.serializers import ModelSerializer | 
projects/views.py中增加
| 1 | from projects.serializer import ProjectModelSerializer | 
修改两个路由
| 1 | # projects/urls.py | 
查看结果


逐步优化之前的代码
之前「快速创建实例」部分为演示最终效果,现在先恢复到原有状态
创建序列化
创建projects/serializer.py
需要输出哪些字段,那么在序列化器中就定义哪些字段
| 1 | from rest_framework import serializers | 
查询单个内容
修改projects.views.ProjectDetail#get
1.通过模型类对象(或者查询集),传给instance 就可以进行序列化操作
2.通过序列化器ProjectSerializer对象的data属性,就可以获取转化后的字典
| 1 | from projects.serializer import ProjectSerializer | 
测试1
| 1 | http :8000/project/1/ | 

查询多个内容
| 1 | class ProjectsList(View): | 
设置many为True可以获取多个内容
测试2
| 1 | http :8000/project/ | 

反序列化部分优化
调用序列化器对象的is_valid方法,开始校验前端参数
- 校验成功返回True
- 校验失败返回False
serializer.is_valid(raise_exception=True)raise_exception=True校验失败会抛出异常当调用
is_valid方法后,才可以调用errors属性,获取校验的错误提示「字典格式」
| 1 | class ProjectsList(View): | 
测试3
| 1 | http :8000/project/ name=1015项目 tester=zx programer=zhong2 publish_app=公众号2 desc=「测试游记」 | 

测试4
再次发送相同内容
| 1 | http :8000/project/ name=1015项目 tester=zx programer=zhong2 publish_app=公众号2 desc=「测试游记」 | 

上面这个错误有些不合理。
修改projects.serializer.ProjectSerializer中的
| 1 | id = serializers.IntegerField(label='ID', read_only=True) | 
增加read_only=True,指定该字段只能进行序列化输出「只读」,不进行反序列化。其他字段默认即可以进行序列化输出,也可以反序列化输出
write_only=True和read_only=True相反,只支持反序列化,不支持序列化。
第二次优化的完整代码
| 1 | import json | 
 
     
        