Flask-ORM-RESTful API 實作ToDo List (下)

jhong
6 min readApr 25, 2021

--

上篇我們講到了查詢紀錄,這篇我們繼續完善功能,在開始前我們要先安裝 POSTMAN , 假如需要進行不同 GET、POST、PUT、DELETE 等等的常用method,或是 API 流程測試時,POSTMAN 會是比瀏覽器更方便的工具,可以讓開發 API 更加容易。想知道更詳細的使用方式可以請教 GOOGLE 大神。

安裝好了以後我們直接新增一個 POSTMAN 的頁面,打上查詢紀錄的連結,就可以顯示出結果。

新增紀錄

新增紀錄的內容的結構會對應 model.py 中的構造函數,在上一篇構造函數中有 content 、 created_at 兩個,但只需要輸入紀錄的內容,創建時間則直接使用 datetime 來自動輸入,最後使用 add() 新增紀錄,這裡使用 POST 來傳輸表單內容。可以參考 flask-sqlalchemy 文件。

@app_api.route('/todo', methods=['POST'])
def create():
content = request.form['content']
lists = List(content, datetime.datetime.now())
db.session.add(lists)
db.session.commit()
return 'create success'

在 POSTMAN 輸入 http://127.0.0.1:5000/api/todo_item ,method 選擇 POST ,然後選 Body 的 from-data ,接著輸入 KEY 的名稱為 content 以及 VALUE 的內容,按下 Send 能看到返回 create success 的訊息就代表已經成功的新增一條紀錄了。接著可以自行試試看查詢紀錄看輸出的結果。

更新紀錄

更新紀錄時先查詢後,找到要更改紀錄的 id 在做更新。我們有兩種方法來更新紀錄。第一種使用 update() 來更新數據,第二種直接把值帶進去。

@app_api.route('/todo/<id>', methods=['PUT'])
def update(id):
new_content = request.form['content']
#使用update
List.query.filter(List.id == id).update(
dict(content=new_content,updata_at=datetime.datetime.now()))
''' #直接帶值
lists = List.query.get(id)
lists.content = new_content
lists.updata_at = datetime.datetime.now()
'''
db.session.commit()
return 'update success'

在 POSTMAN 輸入 http://127.0.0.1:5000/api/todo/id ,method 選擇 PUT,然後選 Body 的 from-data ,接著輸入 KEY 的名稱為 content 以及 VALUE 的內容,按下 Send 能看到返 update success 的訊息就代表已經成功的更新該筆紀錄了。接著可以自行試試看查詢紀錄看輸出的結果。

刪除紀錄

刪除紀錄時也是先查詢後,找到要刪除紀錄的 id 在做刪除。這裡製作了兩種刪除:邏輯刪除、物理刪除。邏輯刪除我們用資料庫欄位 deleted_at 來判斷,物理刪除則使用 delete() 直接刪除。

先使用物理刪除來操作,直接刪除。

@app_api.route('/todo/<id>', methods=['DELETE'])
def delete_physical(id):
lists = List.query.get(id)
db.session.delete(lists)
db.session.commit()
return 'delete success'

在 POSTMAN 輸入
http://127.0.0.1:5000/api/todo/id,method 選擇 DELETE,按下 Send 能看到返回 deletes uccess 的訊息就代表已經成功的刪除該筆紀錄了。接著可以自行試試看查詢紀錄看輸出的結果。

在使用邏輯刪除來操作,我們在刪除的時候給 deleted_at 欄位輸入刪除的時間,只要在查詢紀錄上多一個判斷 List.deleted_at== None 就不會顯示已刪除的該筆紀錄。這裡也有兩種方法可以實現。

@app_api.route('/todo/<id>', methods=['DELETE'])
def delete_logic(id):
List.query.filter(List.id == id).update(
dict(deleted_at=datetime.datetime.now()))
#lists = List.query.get(id)
#lists.deleted_at = datetime.datetime.now()
db.session.commit()
return 'delete success'

由於使用邏輯刪除,所以前面的查詢紀錄的程式碼都要稍微更改一下,在查詢判斷式裡面要增加 List.deleted_at== None 才能成功實現。

lists = List.query.filter(List.deleted_at == None).all()

本篇用 Flask_SQLAlchemy 跟 API 完成了簡單的 ListToDo 的增刪查改的操作,在有些功能上還是有著缺陷,但不影響基本的功能。希望能透過這次實作能幫助到讀者。

--

--