测试开发进阶(二十五)
欢迎关注我的公众号「测试游记」
痛点
- 代码冗余极其严重,不符合优秀测开风格
- 数据校验非常麻烦,且可复用性差
- 编码没有统一的规范,杂乱无章的感觉
- 写的代码非常多,不够简洁
- 仅支持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 |