回顾

上回说到,编写项目权限相关接口,但是我们只完成了核心方法的编写,这次我们就来定义相关的接口。

编写接口

先实现项目的查询和新增接口,接着实现项目角色的添加接口。

编写app/controllers/project/project.py

  1. from flask import Blueprint, request, jsonify
  2. from app import pity
  3. from app.dao.project.ProjectDao import ProjectDao
  4. from app.handler.fatcory import ResponseFactory
  5. from app.handler.page import PageHandler
  6. from app.utils.decorator import permission
  7. pr = Blueprint("project", __name__, url_prefix="/project")
  8. @pr.route("/list")
  9. @permission()
  10. def list_project(user_info):
  11. """
  12. 获取项目列表
  13. :param user_info:
  14. :return:
  15. """
  16. page, size = PageHandler.page()
  17. user_role, user_id = user_info["role"], user_info["id"]
  18. name = request.args.get("name")
  19. result, total, err = ProjectDao.list_project(user_id, user_role, page, size, name)
  20. if err is not None:
  21. return jsonify(dict(code=110, data=result, msg=err))
  22. return jsonify(dict(code=0, data=ResponseFactory.model_to_list(result), msg="操作成功"))
  23. @pr.route("/insert", methods=["POST"])
  24. @permission(pity.config.get("MANAGER"))
  25. def insert_project(user_info):
  26. try:
  27. user_id = user_info["id"]
  28. data = request.get_json()
  29. if not data.get("name") or not data.get("owner"):
  30. return jsonify(dict(code=101, msg="项目名称/项目负责人不能为空"))
  31. private = data.get("private", False)
  32. err = ProjectDao.add_project(data.get("name"), data.get("owner"), user_id, private)
  33. if err is not None:
  34. return jsonify(dict(code=110, msg=err))
  35. return jsonify(dict(code=0, msg="操作成功"))
  36. except Exception as e:
  37. return jsonify(dict(code=111, msg=str(e)))

这边基本上很简单,流程就是 获取参数->校验参数->调用方法,获取返回结果,成功失败返回不同的response.

注意到代码里面有一处bug:

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图1

  • 把蓝图加入run.py

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图2

测试一下

这里我们先调用了登录接口拿到了token:

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图3

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图4

仔细查看原因,发现是这里出了问题:

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图5

可以看到在用Python写多个返回值的时候,一定要记得返回多少就用多少,不然IDE并不会给出提示。这也是Python的一个小缺点吧,当然它也可以指定返回类型,只不过我觉得复杂了。

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图6

由于err是我们预期的err,并且我们有做try/except处理,所以我们直接raise,抛出异常即可。

  • 再次尝试

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图7

测试添加项目接口

除了token以外我们需要3个数据: 项目名字、项目管理员、项目权限。

这边我直接偷懒,去数据库查看有哪些用户:

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图8

可以看到user_id从1到4都有,我这边选4(李逍遥)当做我这个测试项目的owner。

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图9

可以看到没有创建成功,提示我权限不足

还记得之前设定好的权限系统吗?因为我把这个接口的权限设置为manager也就是经理才能创建项目。所以在我们还没有完成用户管理页面的时候,我们先在数据库软件或用sql去手动修改:

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图10

接着我们需要重新登录,获取新token。

可能有的读者发现一个问题,这样如果改动了用户的权限,用户还需要重新登录,为什么不能在解析用户信息的时候,重新获取一遍用户信息呢?这是一个很好的问题,问就是两者都可以呀,都没毛病的。你甚至可以把用户信息缓存到redis,不用每次都读db。

  • 重新测试

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图11

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图12

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图13

可以看到我们的代码写的太随意,导致if写错了,修正如下:

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图14

  • 重启服务后测试

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图15

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图16

又报错了,commit是一个不接受参数的方法,所以我们直接去掉。而且还有一个问题,就是返回值我是复制的上一个方法的,导致多了2个0。我们一并处理掉:

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图17

  • 再次测试

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图18

  • 通过project/list接口去查看

测试平台系列(20) 编写项目的增删改查接口和页面(2) - 图19

所以我们编写代码需要仔细一点,就算是复制/粘贴也要更细心,不能像笔者一样马虎!

后续测试

其实我们这边的接口是分不同场景的,不同的角色需要不同的测试场景,我们这边设计用例的时候还需要考虑普通用户的项目权限问题,这些就留给读者课后去测试了。


今天的内容就到这里了,只写了2个接口,下一篇开始继续回到前端,写相关的页面!如果觉得每篇篇幅较短的话,可以给我提建议,我争取满足大家~