回顧
上回說到最楷,編寫項(xiàng)目權(quán)限相關(guān)接口,但是我們只完成了核心方法的編寫铲敛,這次我們就來定義相關(guān)的接口褐澎。
編寫接口
先實(shí)現(xiàn)項(xiàng)目的查詢和新增接口,接著實(shí)現(xiàn)項(xiàng)目角色的添加接口伐蒋。
編寫app/controllers/project/project.py
from flask import Blueprint, request, jsonify
from app import pity
from app.dao.project.ProjectDao import ProjectDao
from app.handler.fatcory import ResponseFactory
from app.handler.page import PageHandler
from app.utils.decorator import permission
pr = Blueprint("project", __name__, url_prefix="/project")
@pr.route("/list")
@permission()
def list_project(user_info):
"""
獲取項(xiàng)目列表
:param user_info:
:return:
"""
page, size = PageHandler.page()
user_role, user_id = user_info["role"], user_info["id"]
name = request.args.get("name")
result, total, err = ProjectDao.list_project(user_id, user_role, page, size, name)
if err is not None:
return jsonify(dict(code=110, data=result, msg=err))
return jsonify(dict(code=0, data=ResponseFactory.model_to_list(result), msg="操作成功"))
@pr.route("/insert", methods=["POST"])
@permission(pity.config.get("MANAGER"))
def insert_project(user_info):
try:
user_id = user_info["id"]
data = request.get_json()
if not data.get("name") or not data.get("owner"):
return jsonify(dict(code=101, msg="項(xiàng)目名稱/項(xiàng)目負(fù)責(zé)人不能為空"))
private = data.get("private", False)
err = ProjectDao.add_project(data.get("name"), data.get("owner"), user_id, private)
if err is not None:
return jsonify(dict(code=110, msg=err))
return jsonify(dict(code=0, msg="操作成功"))
except Exception as e:
return jsonify(dict(code=111, msg=str(e)))
這邊基本上很簡(jiǎn)單乱凿,流程就是 獲取參數(shù)->校驗(yàn)參數(shù)->調(diào)用方法,獲取返回結(jié)果咽弦,成功失敗返回不同的response.
注意到代碼里面有一處bug:
- 把藍(lán)圖加入run.py
測(cè)試一下
這里我們先調(diào)用了登錄接口拿到了token:
仔細(xì)查看原因徒蟆,發(fā)現(xiàn)是這里出了問題:
可以看到在用Python寫多個(gè)返回值的時(shí)候型型,一定要記得返回多少就用多少段审,不然IDE并不會(huì)給出提示。這也是Python的一個(gè)小缺點(diǎn)吧闹蒜,當(dāng)然它也可以指定返回類型寺枉,只不過我覺得復(fù)雜了。
由于err是我們預(yù)期的err绷落,并且我們有做try/except處理姥闪,所以我們直接raise,拋出異常即可砌烁。
- 再次嘗試
測(cè)試添加項(xiàng)目接口
除了token以外我們需要3個(gè)數(shù)據(jù): 項(xiàng)目名字筐喳、項(xiàng)目管理員、項(xiàng)目權(quán)限函喉。
這邊我直接偷懶避归,去數(shù)據(jù)庫查看有哪些用戶:
可以看到user_id從1到4都有,我這邊選4(李逍遙)當(dāng)做我這個(gè)測(cè)試項(xiàng)目的owner管呵。
可以看到?jīng)]有創(chuàng)建成功梳毙,提示我權(quán)限不足。
還記得之前設(shè)定好的權(quán)限系統(tǒng)嗎捐下?因?yàn)槲野堰@個(gè)接口的權(quán)限設(shè)置為manager也就是經(jīng)理才能創(chuàng)建項(xiàng)目账锹。所以在我們還沒有完成用戶管理頁面的時(shí)候,我們先在數(shù)據(jù)庫軟件或用sql去手動(dòng)修改:
接著我們需要重新登錄坷襟,獲取新token奸柬。
可能有的讀者發(fā)現(xiàn)一個(gè)問題,這樣如果改動(dòng)了用戶的權(quán)限啤握,用戶還需要重新登錄鸟缕,為什么不能在解析用戶信息的時(shí)候,重新獲取一遍用戶信息呢?這是一個(gè)很好的問題懂从,問就是兩者都可以呀授段,都沒毛病的。你甚至可以把用戶信息緩存到redis番甩,不用每次都讀db侵贵。
- 重新測(cè)試
可以看到我們的代碼寫的太隨意,導(dǎo)致if寫錯(cuò)了缘薛,修正如下:
- 重啟服務(wù)后測(cè)試
又報(bào)錯(cuò)了窍育,commit是一個(gè)不接受參數(shù)的方法,所以我們直接去掉宴胧。而且還有一個(gè)問題漱抓,就是返回值我是復(fù)制的上一個(gè)方法的,導(dǎo)致多了2個(gè)0恕齐。我們一并處理掉:
- 再次測(cè)試
- 通過project/list接口去查看
所以我們編寫代碼需要仔細(xì)一點(diǎn)乞娄,就算是復(fù)制/粘貼也要更細(xì)心,不能像筆者一樣馬虎显歧!
后續(xù)測(cè)試
其實(shí)我們這邊的接口是分不同場(chǎng)景的仪或,不同的角色需要不同的測(cè)試場(chǎng)景,我們這邊設(shè)計(jì)用例的時(shí)候還需要考慮普通用戶的項(xiàng)目權(quán)限問題士骤,這些就留給讀者課后去測(cè)試了范删。
今天的內(nèi)容就到這里了,只寫了2個(gè)接口拷肌,下一篇開始繼續(xù)回到前端到旦,寫相關(guān)的頁面!如果覺得每篇篇幅較短的話廓块,可以給我提建議厢绝,我爭(zhēng)取滿足大家~