使用 Flask-RESTX 設定 Task API 的輸入輸出規格
使用 Flask-RESTX 建立 Task Update API 並測試
使用 Flask-RESTX 建立 Task Create API 並測試
新的一個禮拜開始了!大家一起加油,往目標邁進!!!
# Update 輸入
task_update_model = api.model("TaskUpdate", {
"id": fields.Integer,
"member_id": fields.Integer,
"title": fields.String,
"priority": fields.String(required=False),
"state": fields.String(required=False),
"start": fields.DateTime(required=False),
"deadline": fields.DateTime(required=False),
"description": fields.String(required=False)
})
# Update 輸出、Create API 的輸入輸出
task_model = api.model("Task", {
"id": fields.Integer(required=False),
"member_id": fields.Integer,
"title": fields.String(required=True),
"priority": fields.String(required=False),
"state": fields.String(required=False),
"start": fields.DateTime(required=False),
"deadline": fields.DateTime(required=False),
"description": fields.String(required=False)
})
利用 task_update_model 規定輸入規格
利用前端輸入的 task id 取得 task
利用前端輸入的資料建立更新用的 update_data
利用 update_data 更新 task,並將結果 commit
利用 task_model 將 task JSON 格式化後回傳
# tasks_controller.py
@tasks_ns.expect(task_update_model) # 輸入
@tasks_ns.marshal_with(task_model) # 輸出
def put(self, id):
"Update Task"
task = get_task_by_id(id)
update_data = get_task_data(tasks_ns)
task = update_task(task, update_data)
return task, 200
# tasks_model.py
def get_task_by_id(id):
return Task.query.get(id)
def update_task(task, update_data):
for key, value in update_data.items():
if value is not None:
setattr(task, key, value)
db.session.commit()
return task
def get_task_data(tasks_ns):
return {
"member_id": tasks_ns.payload.get("member_id"),
"title": tasks_ns.payload.get("title"),
"priority": tasks_ns.payload.get("priority"),
"state": tasks_ns.payload.get("state"),
"start": tasks_ns.payload.get("start"),
"deadline": tasks_ns.payload.get("deadline"),
"description": tasks_ns.payload.get("description")
}
在思考該如何更新資料的時候找到了 setattr() 這個好用的函數,直接給定 object、key、value,就能夠建立鍵值對,相當方便!
Task Create 的邏輯流程:
# tasks_controller.py
@tasks_ns.expect(task_model)
@tasks_ns.marshal_with(task_model)
def post(self):
"Create New Task"
new_task = get_task_data(tasks_ns)
task = add_task(new_task)
return task
# tasks_model.py
def add_task(newTask):
task = Task(**newTask)
db.session.add(task) # 將物件加入到資料庫會話中
db.session.commit()
return task
測試 API
到目前為止我們 Task 的 API 都已經完成了
接下來就要進入 member 的部分了,同時還會用到 JWT 來做會員驗證!