测试开发进阶(二十五)

来呀~

欢迎关注我的公众号「测试游记」

痛点

  • 代码冗余极其严重,不符合优秀测开风格

  • 数据校验非常麻烦,且可复用性差

  • 编码没有统一的规范,杂乱无章的感觉

  • 写的代码非常多,不够简洁

  • 仅支持json格式的传参,不支持form表单传参

  • 仅能返回json格式的数据,其他类型不支持

  • 列表页视图没有分页,过滤,排序功能

Django REST framework

  1. 在Django框架基础上,进行二次开发

  2. 用于构建Restful API

  3. 简称为DRF框架或REST freamwork框架

特性

  • 提供了强大的Serializer序列化器,可以高效地进行序列化与反序列化操作

  • 提供了丰富的类视图,Mixin扩展类,ViewSet视图集

  • 提供了直观的Web API界面

  • 多种身份认证和权限认证

  • 强大的排序,过滤,分页,搜索,限流等功能

  • 可扩展性,插件丰富

安装

$ pip install djangorestframework

配置

LearnDjango/settings.py中添加 'rest_framework'

INSTALLED_APPS = [	
    'django.contrib.admin',	
    'django.contrib.auth',	
    'django.contrib.contenttypes',	
    'django.contrib.sessions',	
    'django.contrib.messages',	
    'django.contrib.staticfiles',	
    'rest_framework',	
    'projects.apps.ProjectsConfig',	
    'interfaces.apps.InterfacesConfig',	
    'corsheaders',	
]

快速创建实例

新建 projects/serializer.py

from rest_framework.serializers import ModelSerializer	
from projects.models import Projects	
class ProjectModelSerializer(ModelSerializer):	
    class Meta:	
        model = Projects	
        fields = '__all__'

projects/views.py中增加

from projects.serializer import ProjectModelSerializer	
from rest_framework.viewsets import ModelViewSet	
class ProjectViewSet(ModelViewSet):	
    queryset = Projects.objects.all()	
    serializer_class = ProjectModelSerializer

修改两个路由

# projects/urls.py	
from django.urls import path	
from projects import views	
from rest_framework.routers import DefaultRouter	
router = DefaultRouter()	
router.register('projects', views.ProjectViewSet)	
urlpatterns = [	
    path('project/', views.ProjectsList.as_view()),	
    path('project/<int:pk>/', views.ProjectDetail.as_view()),	
]	
urlpatterns += router.urls	
# LearnDjango/urls.py	
from django.contrib import admin	
from django.urls import path, include, re_path	
urlpatterns = [	
    path('admin/', admin.site.urls),	
    path('interfaces/', include('interfaces.urls')),	
    path('', include('projects.urls')),	
    path('api/', include('rest_framework.urls')),	
]

查看结果

640?wx_fmt=jpeg

640?wx_fmt=jpeg

逐步优化之前的代码

之前「快速创建实例」部分为演示最终效果,现在先恢复到原有状态

创建序列化

创建 projects/serializer.py

需要输出哪些字段,那么在序列化器中就定义哪些字段

from rest_framework import serializers	
# 1.继承Serializer类或者子类	
class ProjectSerializer(serializers.Serializer):	
    """	
    创建项目序列化器类	
    """	
    # label选项相当于verbose_name	
    # help_text相当于帮助信息	
    #	
    id = serializers.IntegerField(label='ID')	
    name = serializers.CharField(label='项目名称', max_length=200, help_text='项目名称')	
    tester = serializers.CharField(label='测试人员', max_length=50, help_text='测试人员')	
    programer = serializers.CharField(label='开发人员', max_length=50, help_text='开发人员')	
    publish_app = serializers.CharField(label='发布应用', max_length=50, help_text='发布应用')	
    # allow_null相当于模型类中的null	
    # allow_blank相当于模型类中的blank	
    desc = serializers.CharField(label='简要描述', help_text='简要描述', allow_blank=True, default='', allow_null=True)

查询单个内容

修改 projects.views.ProjectDetail#get

1.通过模型类对象(或者查询集),传给instance 就可以进行序列化操作
2.通过序列化器ProjectSerializer对象的data属性,就可以获取转化后的字典
from projects.serializer import ProjectSerializer	
class ProjectDetail(View):	
    def get(self, request, pk):	
        project = Projects.objects.get(id=pk)	
        serializer = ProjectSerializer(instance=project)	
        return JsonResponse(serializer.data)
测试1
$ http :8000/project/1/	
zhongxindeMacBook-Pro:~ zhongxin$ http :8000/project/1/	
HTTP/1.1 200 OK	
Content-Length: 135	
Content-Type: application/json	
Date: Mon, 14 Oct 2019 16:06:10 GMT	
Server: WSGIServer/0.2 CPython/3.7.1	
Vary: Origin	
X-Frame-Options: SAMEORIGIN	
{	
    "desc": "666",	
    "id": 1,	
    "name": "测试游记",	
    "programer": "zhong",	
    "publish_app": "公众号",	
    "tester": "zx"	
}

640?wx_fmt=jpeg

查询多个内容

class ProjectsList(View):	
    def get(self, reuqest):	
        project_qs = Projects.objects.all()	
        serializer = ProjectSerializer(instance=project_qs, many=True)	
        return JsonResponse(serializer.data, safe=False)

设置 manyTrue可以获取多个内容

测试2
$ http :8000/project/	
zhongxindeMacBook-Pro:~ zhongxin$ http :8000/project/	
HTTP/1.1 200 OK	
Content-Length: 438	
Content-Type: application/json	
Date: Mon, 14 Oct 2019 16:15:58 GMT	
Server: WSGIServer/0.2 CPython/3.7.1	
Vary: Origin	
X-Frame-Options: SAMEORIGIN	
[	
    {	
        "desc": "666",	
        "id": 1,	
        "name": "测试游记",	
        "programer": "zhong",	
        "publish_app": "公众号",	
        "tester": "zx"	
    },	
    {	
        "desc": "6666",	
        "id": 2,	
        "name": "测试游记1",	
        "programer": "zhong1",	
        "publish_app": "公众号1",	
        "tester": "zx1"	
    },	
    {	
        "desc": "666",	
        "id": 3,	
        "name": "「测试游记」-创建",	
        "programer": "zx",	
        "publish_app": "公众号",	
        "tester": "zx"	
    }	
]

640?wx_fmt=jpeg

反序列化部分优化

调用序列化器对象的is_valid方法,开始校验前端参数

  • 校验成功返回True

  • 校验失败返回False

serializer.is_valid(raise_exception=True) raise_exception=True校验失败会抛出异常

当调用 is_valid方法后,才可以调用 errors属性,获取校验的错误提示「字典格式」

class ProjectsList(View):	
    def post(self, request):	
        """	
        新建项目	
        """	
        json_data = request.body.decode('utf8')	
        python_data = json.loads(json_data, encoding='utf8')	
        serializer = ProjectSerializer(data=python_data)	
        # 校验前端输入的数据	
        try:	
            serializer.is_valid(raise_exception=True)	
        except Exception as e:	
            return JsonResponse(serializer.errors)	
        project = Projects.objects.create(**serializer.validated_data)	
        serializer = ProjectSerializer(instance=project)	
        return JsonResponse(serializer.data, status=201)
测试3
$ http :8000/project/ name=1015项目 tester=zx programer=zhong2  publish_app=公众号2 desc=「测试游记」	
zhongxindeMacBook-Pro:~ zhongxin$ http :8000/project/ name=1015项目 tester=zx programer=zhong2  publish_app=公众号2 desc=「测试游记」	
HTTP/1.1 201 Created	
Content-Length: 162	
Content-Type: application/json	
Date: Mon, 14 Oct 2019 16:26:19 GMT	
Server: WSGIServer/0.2 CPython/3.7.1	
Vary: Origin	
X-Frame-Options: SAMEORIGIN	
{	
    "desc": "「测试游记」",	
    "id": 7,	
    "name": "1015项目",	
    "programer": "zhong2",	
    "publish_app": "公众号2",	
    "tester": "zx"	
}

640?wx_fmt=jpeg

测试4

再次发送相同内容

$ http :8000/project/ name=1015项目 tester=zx programer=zhong2  publish_app=公众号2 desc=「测试游记」

640?wx_fmt=jpeg

上面这个错误有些不合理。

修改 projects.serializer.ProjectSerializer中的

id = serializers.IntegerField(label='ID', read_only=True)

增加 read_only=True,指定该字段只能进行序列化输出「只读」,不进行反序列化。其他字段默认即可以进行序列化输出,也可以反序列化输出

write_only=Trueread_only=True相反,只支持反序列化,不支持序列化。

第二次优化的完整代码

import json	
from django.http import JsonResponse, Http404	
from projects.models import Projects	
from django.views import View	
from projects.serializer import ProjectSerializer	
class ProjectsList(View):	
    def get(self, reuqest):	
        project_qs = Projects.objects.all()	
        serializer = ProjectSerializer(instance=project_qs, many=True)	
        return JsonResponse(serializer.data, safe=False)	
    def post(self, request):	
        """	
        新建项目	
        """	
        json_data = request.body.decode('utf8')	
        python_data = json.loads(json_data, encoding='utf8')	
        serializer = ProjectSerializer(data=python_data)	
        # 校验前端输入的数据	
        # 调用序列化器对象的is_valid方法,开始校验前端参数	
        # serializer.is_valid(raise_exception=True) raise_exception=True校验失败会抛出异常	
        try:	
            serializer.is_valid(raise_exception=True)	
        except Exception as e:	
            return JsonResponse(serializer.errors)	
        project = Projects.objects.create(**serializer.validated_data)	
        serializer = ProjectSerializer(instance=project)	
        return JsonResponse(serializer.data, status=201)	
class ProjectDetail(View):	
    def get_object(self, pk):	
        try:	
            return Projects.objects.get(id=pk)	
        except Projects.DoesNotExist:	
            raise Http404	
    def get(self, request, pk):	
        project = self.get_object(pk)	
        serializer = ProjectSerializer(instance=project)	
        return JsonResponse(serializer.data)	
    def put(self, request, pk):	
        project = self.get_object(pk)	
        json_data = request.body.decode('utf8')	
        python_data = json.loads(json_data, encoding='utf8')	
        serializer = ProjectSerializer(data=python_data)	
        try:	
            serializer.is_valid(raise_exception=True)	
        except Exception as e:	
            return JsonResponse(serializer.errors)	
        project.name = serializer.validated_data['name']	
        project.leader = serializer.validated_data['leader']	
        project.tester = serializer.validated_data['tester']	
        project.programer = serializer.validated_data['programer']	
        project.publish_app = serializer.validated_data['publish_app']	
        project.desc = serializer.validated_data['desc']	
        project.save()	
        serializer = ProjectSerializer(instance=project)	
        return JsonResponse(serializer.data, status=201)	
    def delete(self, request, pk):	
        project = self.get_object(pk)	
        project.delete()	
        return JsonResponse({}, safe=True, status=204)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面中可以对界面中显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面中查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
基于hal库的OLED显示屏驱动C语言实现源码.zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值