diff --git a/bookmarks_2021_9_15.html b/bookmarks_2021_9_15.html
new file mode 100644
index 0000000..e2bec29
--- /dev/null
+++ b/bookmarks_2021_9_15.html
@@ -0,0 +1,144 @@
+
+
+
+
Bookmarks
+Bookmarks
+
+
书签栏
+
+
- 百度一下,你就知道
+
- CSDN - 专业开发者社区
+
工作
+
+
Gitlink
+
+
- ForgePlus后台管理
+
- TrustieForgeTest
+
- TrustieForge
+
- 内网forge
+
+
红山开源
+
+
- 公告测试环境
+
- 公告后台测试环境
+
- 红山开源社区
+
- 创客
+
+
数字园区
+
+
- 数字园区管理系统
+
+
其他
+
+
- 阿里邮箱企业版
+
- ProcessOn - 我的文件
+
- 腾讯文档
+
- 蓝湖
+
- iLovePDF | 为PDF爱好者提供的PDF文件在线处理工具
+
- 企业云邮箱POP\SMTP\IMAP地址和端口信息 - 企业邮箱 - 阿里云
+
- 工作台 [Jenkins]
+
- 项目 - 先进院
+
- Your Authtoken - ngrok
+
- 幕布
+
- Gitea
+
- 我的工作台 - Gitee.com
+
+
+
学习
+
+
- npm : 无法加载文件 D:\Program Files\nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本。_Alex-CSDN博客
+
- Api Root – Django REST framework
+
- 组件 | Element
+
- Vue.js
+
- MySQL 连接出现 Authentication plugin 'caching_sha2_password' cannot be loaded - 漠里 - 博客园
+
- 测试平台接口文档
+
- 介绍 | vue-element-admin
+
- lin-xin/vue-manage-system at V4.2.0
+
- 分享三个开源软件:BlueSpice、XWiki 和 DokuWiki 了解一下_IT专家网
+
- Ledge:这可能是距今最好的『DevOps + 研发效能』知识平台_工具
+
- KANO 模型_百度百科
+
- 什么是卡诺KANO模型? - 知乎
+
- (1条消息) 利用 Webhooks 实现代码的自动拉取_潜心做事的博客-CSDN博客
+
- 面试必问的性能测试流程,你真的会吗?
+
- Jmeter常用的两大性能测试场景 - 小公瑾 - 博客园
+
- 面试小结汇总
+
- AB压力测试工具 - 简书
+
- (24条消息) ab压力测试_咦呀的博客-CSDN博客_ab压力测试
+
- 性能测试工具一之ab(一)_天下任我行-CSDN博客_ab性能测试工具
+
- Git创建tag标签命令_Blossom-CSDN博客_git 创建tag
+
- 虚拟机 - Microsoft Edge Developer
+
- ngrok的使用(超详细)_流年轻逝-CSDN博客_ngrok
+
- 跳槽?面试软件测试需要掌握的7个技能Get了吗?
+
- 何隆昌git命令清除账号密码_何隆昌的博客-CSDN博客
+
- git清除本地账户_big_sea_m的博客-CSDN博客
+
- Git 多账号切换 (Windows10系统操作) - 崽_崽 - 博客园
+
- Python模块学习 - Paramiko - 一只小小的寄居蟹 - 博客园
+
- Python模块学习 - Paramiko - Dahlhin - 博客园
+
- Python自动化运维 - paramiko模块介绍及使用 - 知乎
+
- (2条消息) phpMyAdmin使用教程_叶落无痕的博客-CSDN博客_phpmyadmin使用教程
+
- python用socket实现客户端在linux服务器上执行命令_weixin_34261415的博客-CSDN博客
+
- centos7中安装python3 - 修瑾 - 博客园
+
- 面试必备:接口自动化测试精选面试干货
+
- python生成requirements.txt的两种方法_Darlewo-CSDN博客
+
- Python 自动生成文件夹目录结构_光明磊学习&积累的地方-CSDN博客_python 生成文件夹目录
+
- git clone出现 fatal: unable to access 'https://github.com/...'的解决办法(亲测有效)_Dashi_Lu的博客-CSDN博客
+
- centos7.9使用rpm安装Jenkins_亲测成功---持续集成部署Jenkins工作笔记0022_全栈哥的专栏-CSDN博客
+
- 月薪40K+银行测试经理,自动化测试实践经验分享
+
- git clone in Haskell from the bottom up
+
- Linux上使用 selenium + chrome 实现无界面的自动化测试_西门一刀的博客-CSDN博客
+
- Google Chrome 64bit Linux版 / chrome64linux稳定版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒
+
- Python中子类调用父类构造函数_笑一个吧-CSDN博客_python调用父类构造函数
+
- Linux下安装pipenv_Peter的脱发日记-CSDN博客_linux pipenv
+
- 【python】linux环境下调用webdriver(各种问题解决办法汇总)_summer-CSDN博客
+
- 新标签页
+
- #pytest
+
- Python库——Faker - 知乎
+
- 基于Pytest框架的自动化测试开发实践(万字长文入门篇)
+
- (推荐)linux用一键安装包 - 禅道开源版使用帮助 - 禅道开源项目管理软件
+
- Fiddler设置断点
+
- Gatling性能测试 - 简书
+
- 如何在Ubuntu上使用微信客户端 | 《Linux就该这么学》
+
- 在Ubuntu 18.04LTS 上使用Wine 安装微信及相应问题的解决方法 - 知乎
+
+
class
+
+
- 百度网盘 请输入提取码
+
- 课堂派-简单好用的互动课堂管理工具
+
- 百度网盘 请输入提取码
+
- 可优
+
- axios
+
- Django 文档 | Django 文档 | Django
+
- Django documentation | Django documentation | Django
+
- 腾讯课堂_职业培训、考试提升在线教育平台
+
- QuerySet API reference | Django documentation | Django
+
- API 参考 | Vue Router
+
- GitHub
+
- HttpRunner V2.x 中文使用文档
+
- AI 软件测试工具 Mabl 介绍 - 知乎
+
+
Tools
+
+
- HTMLTestRunner · PyPI
+
- 五、数据驱动的使用 - unittestreport 使用文档
+
- unittestreport · PyPI
+
- pytest-testreport · PyPI
+
- 免费logo设计生成_公司logo设计在线制作神器 - 标智客
+
- 包图网_专注原创商用设计图片下载,会员免费设计素材模板独家图库
+
+
湖大
+
+
- 2021年硕士研究生考试大纲-湖南大学研究生院
+
- 湖南大学2018年硕士研究生招生考试考生进入复试的初试成绩基本要求-湖南大学研究生院
+
- 信息科学与工程学院2019年硕士研究生复试工作实施细则-湖南大学研究生院
+
- 信科院硕士研究生入学复试机考测试大纲-湖大信息科学与工程学院
+
- 湖南大学2020年硕士研究生招生学科、专业目录-湖南大学研究生院
+
- CCF CSP认证
+
+
教程
+
+
- ubuntu下通过wine安装windows软件(以微信和Adobe Acrobat Pro为例) - 知乎
+
+
+
diff --git a/views copy3.py b/views copy3.py
new file mode 100644
index 0000000..f0dbe60
--- /dev/null
+++ b/views copy3.py
@@ -0,0 +1,147 @@
+import json
+
+from django.http import HttpResponse, JsonResponse, Http404
+from django.shortcuts import render
+from django.views import View
+from .models import ProjectsInfo
+from . import serializers
+from rest_framework.views import APIView
+
+class Projects(View):
+
+ def parse(self, request):
+ content_type = request.headers.get("Content-Type")
+ if content_type == "application/json":
+ try:
+ return json.loads(request.body)
+ except Exception as e:
+ result = {"message": f"{e}", "code": "0"}
+ return JsonResponse(result, status=400, safe=False,
+ json_dumps_params={"ensure_ascii": False})
+ elif content_type == "application/x-www-form-urlencoded":
+ return request.POST
+ else:
+ pass
+
+ def get(self, request):
+ """1.需要能获取到项目的列数数据(获取所有数据)
+ url: /projects/ method:GET response data: json"""
+ # 从数据库读取所有的项目数据(QuerySet对象)
+ qs = ProjectsInfo.objects.all()
+
+ # 序列化输出
+ # 注意:查询集中涉及到多条数据要用many=true,会返回一个列表
+ serializer = serializers.ProjectModelSerializer(instance=qs, many=True)
+ return JsonResponse(serializer.data, safe=False, status=200, json_dumps_params={"ensure_ascii": False})
+
+ def post(self, request):
+ """3.能够创建项目(创建一个项目)
+ url: /projects/ method:POST request data: json response data: json"""
+ """
+ Content-Type=application/json
+ 请求体参数:
+ {"name": "项目名称,必填,唯一",
+ "leader": "负责人,必填",
+ "is_execute": "是否执行, 非必填",
+ "desc": "描述,非必填"}
+ """
+
+ try:
+ serializer = serializers.ProjectModelSerializer(data=self.parse(request))
+ serializer.is_valid(raise_exception=True)
+ # 这里添加token与在序列化器类种添加token一致
+ # serializer.validated_data["token"] = "validate token" # 使用这个不能调用serializer.save()
+ serializer.save()
+ except Exception as e:
+ result = {"message": f"{e}", "code": "0"}
+ return JsonResponse(result, status=400, safe=False,
+ json_dumps_params={"ensure_ascii": False})
+ res = serializer.validated_data
+ return JsonResponse(res, safe=False, status=200,
+ json_dumps_params={"ensure_ascii": False})
+
+
+class ProjectsPK(View):
+ primary_key_name = "pk"
+
+ def get_object(self):
+ try:
+ # return ProjectsInfo.objects.get(id=pk)
+ # return ProjectsInfo.objects.get(**self.kwargs)
+ pk = self.kwargs.get(self.primary_key_name)
+ return ProjectsInfo.objects.get(pk=pk)
+ except Exception:
+ raise Http404
+
+ def get(self, request, pk):
+ """ 2.需要能获取到项目的详情数据(获取前端指定某一条数据)
+ url: /projects// method:GET response data: json"""
+ obj = self.get_object()
+ serializer = serializers.ProjectModelSerializer(instance=obj)
+ return JsonResponse(serializer.data, safe=False, status=200, json_dumps_params={"ensure_ascii": False})
+
+ def put(self, request, pk):
+ """ 4.能够更新项目(只更新某一个项目)
+ url: /projects// method:PUT request data: json response data: json"""
+ # 从前端获取待更新的项目数据
+ try:
+ python_dict = json.loads(request.body)
+ obj = self.get_object()
+ serializer = serializers.ProjectModelSerializer(instance=obj,
+ data=python_dict)
+ serializer.is_valid(raise_exception=True)
+ serializer.save()
+ except Exception as e:
+ result = {"message": f"{e}", "code": "0"}
+ return JsonResponse(result, status=400, safe=False,
+ json_dumps_params={"ensure_ascii": False})
+ return JsonResponse(serializer.data, status=200, safe=False,
+ json_dumps_params={"ensure_ascii": False})
+
+ def delete(self, request, pk):
+ """ 5.能够删除项目(只删除某一个项目)
+ url: /projects// method:DELETE"""
+ obj = self.get_object()
+ # 项目模型对象调用delete方法
+ obj.delete()
+ # 返回空给前端
+ return JsonResponse(None, status=204, safe=False, json_dumps_params={"ensure_ascii": False})
+
+
+"""
+反序列化输入过程
+ 将前端传递的参数(json参数,www-form参数)转换为python常用数据类型(字典,列表嵌套字典)
+
+数据库校验过程
+
+
+数据库操作过程(创建,更新操作,读取操作,删除)
+
+序列化输出过程
+ 将python常见的数据类型或者模型类转换为前端能正常解析的json/xml字符串
+
+
+5个接口分别涉及的过程
+ 获取所有的项目数据:数据库操作过程,序列化输出过程
+ 创建项目:反序列化输入过程,数据校验过程,数据库操作过程,序列化输出过程
+ 获取单个项目数据:数据库操作过程,序列化输出过程
+ 更新项目:反序列化输入过程,数据校验过程,数据库操作过程,序列化输出过程
+ 删除项目:数据库操作过程
+
+当前设计的5个接口,有哪些痛点
+ 代码冗余非常严重,不够简洁
+ 数据校验极为麻烦,可读性差,复用性更差
+ 代码没有统一的规范,维护性差
+ 序列化输出的过程没有差异性
+ 在获取所有项目的接口中,有很多功能缺失:
+ 没有提供分页功能
+ 没有提供过滤功能
+ 没有提供排序功能
+
+ 整个项目,也有功能缺失
+ 没有提供认证授权功能
+ 没有提供限流功能(反爬虫)
+ 5个接口不能放在同一个类视图中定义
+ 传递参数的方式单一,不支持www-form表单参数
+
+"""