首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >测试开发进阶(三十六)

测试开发进阶(三十六)

作者头像
zx钟
发布于 2019-11-14 06:51:28
发布于 2019-11-14 06:51:28
40300
代码可运行
举报
文章被收录于专栏:测试游记测试游记
运行总次数:0
代码可运行

项目模块

list优化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())

    page = self.paginate_queryset(queryset)
    if page is not None:
        serializer = self.get_serializer(page, many=True)
        datas = serializer.data
        datas = get_count_by_project(datas)
        return self.get_paginated_response(datas)

    serializer = self.get_serializer(queryset, many=True)
    datas = serializer.data
    datas = get_count_by_project(datas)
    return Response(datas)

这个 list其实就是拷贝了父类中的 list方法

使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
super().list(request, *args, **kwargs)

调用父类的 list方法

查看返回的 Response对象

所以优化为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def list(self, request, *args, **kwargs):
    response = super().list(request, *args, **kwargs)
    response.data['results'] = get_count_by_project(response.data['results'])
    return response

重写getserializerclass

names中的 serializer使用 serializers.ProjectNameSerializer

为了让它可以直接使用 self.get_serializer方法,重写 get_serializer_class

源码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_serializer_class(self):
    """
    Return the class to use for the serializer.
    Defaults to using `self.serializer_class`.

    You may want to override this if you need to provide different
    serializations depending on the incoming request.

    (Eg. admins get full serialization, others get basic serialization)
    """
    assert self.serializer_class is not None, (
        "'%s' should either include a `serializer_class` attribute, "
        "or override the `get_serializer_class()` method."
        % self.__class__.__name__
    )

    return self.serializer_class
重写
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_serializer_class(self):
    if self.action == 'names':
        return serializers.ProjectNameSerializer
    else:
        return self.serializer_class

报告模块

序列化器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from datetime import datetime
from rest_framework import serializers
from .models import Reports


class ReportsSerializer(serializers.ModelSerializer):
    """
    报告序列化器
    """

    class Meta:
        model = Reports
        exclude = ('update_time', 'is_delete')
        extra_kwargs = {
            'html': {
                'write_only': True
            },
            'create_time': {
                'read_only': True
            }
        }

    def create(self, validated_data):
        report_name = validated_data['name']
        validated_data['name'] = f"{report_name}_{datetime.strftime(datetime.now(), '%Y%m%d%H%M%S')}"
        report = Reports.objects.create(**validated_data)
        return report

数据库中可以看出其中 html是一串字符串,它需要转换成html格式才可以正常展示,所以在接口返回的内容中不应该包含它,设置它为只写模式 write_only

create函数进行重定义

下面是数据库中显示的内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name = models.CharField('报告名称', max_length=200, unique=True, help_text='报告名称')

查看 models文件可以看到 name字段是唯一的「 unique=True」所以我们在添加的时候需要携带上当前的时间信息

视图

定义一个类 ReportsViewSet还是继承 ModelViewSet

其他和之前的类似

其中要注意的是一个 download接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
import os
from datetime import datetime

from django.conf import settings
from django.http import StreamingHttpResponse
from rest_framework.viewsets import ModelViewSet
from rest_framework import permissions
from rest_framework.decorators import action

from reports.utils import format_output, get_file_contents
from .models import Reports
from .serializers import ReportsSerializer


class ReportsViewSet(ModelViewSet):
    """
    list:
    返回测试报告(多个)列表数据

    create:
    创建测试报告

    retrieve:
    返回测试报告(单个)详情数据

    update:
    更新(全)测试报告

    partial_update:
    更新(部分)测试报告

    destroy:
    删除测试报告

    """
    queryset = Reports.objects.filter(is_delete=False)
    serializer_class = ReportsSerializer
    permission_classes = (permissions.IsAuthenticated,)
    ordering_fields = ('id', 'name')

    def perform_destroy(self, instance):
        instance.is_delete = True
        instance.save()

    def list(self, request, *args, **kwargs):
        response = super().list(request, *args, **kwargs)
        response.data['results'] = format_output(response.data['results'])
        return response

    @action(detail=True)
    def download(self, request, pk=None):
        instance = self.get_object()
        html = instance.html
        name = instance.name
        mtch = re.match(r'(.*_)\d+', name)
        if mtch:
            mtch = mtch.group(1) + datetime.strftime(datetime.now(), '%Y%m%d%H%M%S') + '.html'
        report_dir = os.path.join(settings.BASE_DIR, 'reports')
        report_path = os.path.join(report_dir, mtch)
        with open(report_path, 'w') as f:
            f.write(html)
        response = StreamingHttpResponse(get_file_contents(report_path))
        response['Content-Type'] = "application/octet-stream"
        response['Content-Disposition'] = "attachment; filename*=UTF-8''{}".format(name)
        return response

每次下载之后我们都会在本地存放一次,然后我们需要以数据流的方式返回html报告

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
response = StreamingHttpResponse(get_file_contents(report_path))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_file_contents(filename, chunk_size=512):
    with open(filename,encoding='utf8') as f:
        while True:
            c = f.read(chunk_size)
            if c:
                yield c
            else:
                break

这里用到了分段的方式,每512字节返回一次,直到全部返回完毕

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
程序员初学机器学习的四种方式
本文由 伯乐在线 - XiaoxiaoLi 翻译自 Jason Brownlee 网址 http://machinelearningmastery.com/self-study-machine-learning-projects/ 学习机器学习有很多方法,大多数人选择从理论开始。 如果你是个程序员,那么你已经掌握了把问题拆分成相应组成部分及设计小项目原型的能力,这些能力能帮助你学习新的技术、类库和方法。这些对任何一个职业程序员来说都是重要的能力,现在它们也能用在初学机器学习上。 要想有效地学习机器学习你
机器学习AI算法工程
2018/03/12
9040
5种无需数学背景也可理解机器学习算法的技巧
在一种自顶向下的研究机器学习的方法中,理论应立足于何处?
Bon
2018/02/06
1.2K1
5种无需数学背景也可理解机器学习算法的技巧
机器学习的5种“兵法"
在研究机器学习中,理论在其整个自上而下方法中试用于哪里呢? 在传统的机器学习教学中,丰富的数学理论知识对于理解机器学习是至关重要的,我的机器学习教学方法通常是教你如何端对端解决问题以及传输结构。 所以此方法哪里要用到理论知识了呢? 在此帖中你将了解我们是如何理解机器学习中的“理论”一词。提示:全部与算法有关。 你会发现一旦你可以熟练解决问题以及传输结果后,你就欲罢不能地想要对机器学习有更深入的理解以及获得更好的结果,没人能拉得住你。 最后,你会发现可以通过应用标准数据集练习机器学习的5个技巧,从而进一步加深
CDA数据分析师
2018/02/05
6000
机器学习的5种“兵法"
【盘点】掌握机器学习的5条必由之路(附学习资料推荐)
【新智元导读】作者在本文提出一种5步入门并应用机器学习的方法。它不是传统的方法。传统的机器学习方法提倡从下往上学,先从理论和数学开始,然后是算法实现,最后让你去解决现实世界的问题。 作者提倡的掌握机器
新智元
2018/03/26
7670
【盘点】掌握机器学习的5条必由之路(附学习资料推荐)
从机器学习开始的4个步骤:初学者开始和实践的自上而下的策略
在这篇文章中,我向你展示了采用自顶向下的策略来入门应用机器学习的方法。我可以看到这个方法分为四个步骤。你应该对这些步骤他们感到熟悉,因为它可能跟你用来学习编程的自上而下的方法相同,亦即,掌握基础知识,大量练习,然后在你找到感觉、进入状态后再深入细节。
花落花飞去
2018/02/05
1.9K0
【机器学习】从零实现来理解机器学习算法
从零开始实现机器学习算法的好处 我推广了从零开始实现机器学习算法的观念。 我认为你可以学到很多关于算法是如何工作的。我也认为,作为一名开发者,它提供了一个学习用于机器学习的数学符号、描述以及直觉的桥梁。 在“从零开始实现机器学习算法的好处”这篇文章里,我已经讨论了从零实现机器学习算法的好处。 在那篇文章,我列出的好处如下: 你获取了知识; 它提供了一个起点; 拥有算法和代码的所属权。 在这篇文章中,我对如何利用现有的教程和书籍来缩短这个学习过程表达了一些个人看法。有一些用于初学的丰富资源,但也要堤防一些绊脚
陆勤_数据人网
2018/02/26
9400
【机器学习】从零实现来理解机器学习算法
机器学习自学指南
有很多途径来学习机器学习。有丰富的资源:有书籍,有课程可以参与,可以参加比赛,有大量供你使用的工具。在这篇文章中,我想围绕这些活动提出一些你机器学习之旅大致会有的阶段并在你程序员通往到机器学习大师之路上给出一个大概的顺序,以及在各个层次上有哪些可供你利用的资源
xixigiggling
2018/02/07
6140
程序员到机器学习工程师的飞跃
“我是一名软件开发工程师,阅读过一些关于机器学习方面的书籍和博客文章,也学习过一些在线的关于机器学习的公开课。但是,我仍然不知道怎么应用到工程实践中……”
fishexpert
2018/11/20
3960
机器学习 从入门到精通的学习方法
我将介绍5个“机器学习”的步骤,这五个步骤是非常规的。
花落花飞去
2018/02/11
2.6K0
机器学习 从入门到精通的学习方法
【干货】开发者如何掌握机器学习?传统方法可能都走了弯路
【新智元导读】作为一名开发者,怎么才能加入时下正火热的机器学习?本文作者Jason认为,传统的方法,包括从经典图书、博客文章或线上课程进行学习成效不大,甚至“错得离谱”。最好的方法其实是动手,不要停留在理论层面,动手实践才能高效的学习。在文章中,作者给出了自己的建议,特别强调机器学习实践过程中的细节,此外,他还推荐了一些可用的机器学习训练平台及数据库。 这篇文章要回答的问题是“我该如何开始机器学习”? “我是一个开发者。我读了一些关于机器学习的文章和书,也在Coursera上学习了机器学习课程。但我仍不知道
新智元
2018/03/23
5990
【干货】开发者如何掌握机器学习?传统方法可能都走了弯路
机器学习自学指南
你有许多方法和资源来学习机器学习:阅读书籍、学习课程、参加比赛和各种可用的工具。在这篇文章中,我想使这些活动更为体系化,并列出一个大致的顺序,以说明在普通程序员到机器学习高手的过程中所要着手什么。
2018/02/06
1.1K0
【越好奇,越强大】伯克利研究人员使用内在激励,教AI学会好奇
来源:Quanta Magazine 编译:Cecilia 【新智元导读】伯克利研究人员正在开发具有好奇心的AI。他们想创造有内在自我驱动能力的AI,而不是依赖人类指令的伪智能。相比外在的奖惩机制,建立方法让智能体拥有内在的好奇心更加重要。研究人员将让AI感到“吃惊”的指数,即对环境预测的误差,作为内在激励函数。吃惊越大,奖励越多,以此让AI迅速掌握环境。 你可能不记得第一次玩“超级马里奥兄弟”是什么感觉,但试着想像一下:蓝色的天空,棋盘石的地面,还有一个蹲着的红色男人在静静等待。他面向右方,你把他推到那个
新智元
2018/03/21
9300
【越好奇,越强大】伯克利研究人员使用内在激励,教AI学会好奇
机器学习工作职位需要的7项技能
机器学习经常与人工智能紧密相连,在不考虑显式编程的情况下,机器学习可以使计算机具备完成特定任务的能力,例如识别,诊断,规划,机器人控制和预测等。它往往聚焦于算法创新,即在面对新数据时,其自身能够发生演化。
IT阅读排行榜
2018/08/13
3040
机器学习工作职位需要的7项技能
机器学习经常与人工智能紧密相连,在不考虑显式编程的情况下,机器学习可以使计算机具备完成特定任务的能力,例如识别,诊断,规划,机器人控制和预测等。它往往聚焦于算法创新,即在面对新数据时,其自身能够发生演化。 在某种程度上,机器学习与数据挖掘很相似。它们都是通过数据来获取模式。然而,与人类可理解的数据提取方式不同—通常是按照数据挖掘应用的方式——机器学习主要是使用数据去提升程序本身的理解能力。机器学习程序能够在数据中检测出相关模式并相应的进行程序行为的调整。 现在,你是否准备去了解一些获得机器学习工作必备的技术
陆勤_数据人网
2018/02/26
5610
机器学习工作职位需要的7项技能
机器学习经常与人工智能紧密相连,在不考虑显式编程的情况下,机器学习可以使计算机具备完成特定任务的能力,例如识别,诊断,规划,机器人控制和预测等。它往往聚焦于算法创新,即在面对新数据时,其自身能够发生演化。 在某种程度上,机器学习与数据挖掘很相似。它们都是通过数据来获取模式。然而,与人类可理解的数据提取方式不同—通常是按照数据挖掘应用的方式——机器学习主要是使用数据去提升程序本身的理解能力。机器学习程序能够在数据中检测出相关模式并相应的进行程序行为的调整。 现在,你是否准备去了解一些获得机器学习工作必备的
CSDN技术头条
2018/02/09
7080
机器学习工作职位需要的7项技能
停止从头开始编写机器学习算法
从头开始实现算法是我看到初学者犯的最大的错误之一。
anthlu
2018/02/08
7920
停止从头开始编写机器学习算法
Kaggle冠军冲顶经验分享:怎样11步搞定机器学习竞赛?
最近,一名来自湖南长沙的小哥仅用15个月时间,就冲上了Kaggle用户排行榜的首位,他的ID是Bestfitting。
量子位
2018/07/24
1.1K0
Kaggle冠军冲顶经验分享:怎样11步搞定机器学习竞赛?
什么是机器学习?
输入“什么是机器学习?” 进入Google搜索将打开一个Pandora的论坛,学术研究和虚假信息框,而本文的目的是在我们的机器学习研究人员小组的直接帮助下简化机器学习的定义和理解。
陈哈哈
2020/07/06
5750
年龄不是上限!我只是按照自己的兴趣专注于机器学习
我只是按照自己的兴趣,尽可能多地专注于学习机器学习。年龄只是一个数字,何时开始以及可以实现多少没有上限。 Philip是Kaggle Competitions Grandmaster,他以17枚金牌名列第 47 位。
炼丹笔记
2022/10/27
3410
Weka机器学习平台的迷你课程
机器学习是个非常吸引人的研究领域,但是您怎么把它真正地应用到您自己的问题上呢?
Bon
2018/02/08
6K0
相关推荐
程序员初学机器学习的四种方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验