本篇文章將一步一步跟著影片實作出一個有CRUD功能的網頁,使用Flask以及Sqlalchemy package
前置作業
Windows10
環境
- 安裝
Python
- 安裝
env
,相關指令如下:
- 在啟動env後安裝Flask和sqlalchemy
建立Flask
新建app.py
以上是flask最基本的樣子,這時還尚未建置html,執行後開啟localhost:5000
網頁可以看到Hello world
字樣
建置基本網頁
新建base.html
,在templates
資料夾底下,這是為了讓jinja2
引擎可以reference
這個頁面是當作其他頁面的根基,讓其他頁面extends
這個base
,就可以不用一直寫重複的html
語句
這裡的{% %}
就是jinja2
用來傳遞訊息的地方,這裡可能還不是很清楚,所以接下來建立index.html
來繼承這個網頁就會比較清楚了
但在那之前要先建置簡單的CSS以便清楚看到結果
建立CSS
這是css檔案放置的路徑,以供jinja2
調用
而在base.html
之中要加入這個css,格式很特殊,而且我的vscode
沒有自動提示🤣錯了一個字就GG了,這裡使用到了jinja2的url_for,以防錯誤,還是在app.py
頂部加入url_for,見以上
建立index首頁
在templates資料夾下建立index.html
這裡extends
了base.html
的內容,並在body block
之中插入了h1
標題,這裡就完成了兩個頁面的結合
建立資料庫
接下來就進入到建置資料庫的環節,使用Sqlalchemy
來使用python
操作sqlite
SQLAlchemy
是為Python
提供的開源SQL
工具包及物件關聯對映器(ORM)
在app.py
中
- sqlite後三個反斜線是相對位置的意思,資料庫取名為test
- 記得
import
需要的packages
建立Model
primary_key=True
就是作為主鍵,值不重複
nullable=False
就可以防止用戶不輸入值
- 最後當這個
db
新增項目的時候,返回一個string
- <Task %r>
把資料庫造出來
這裡要直接在terminal
使用python
但在那之前要先開起env
,如一開始所述,接著就輸入以下三行
順利執行後就可以看到project
資料夾的instance
資料夾底下有一個test.db
了
這裡出現了一個小插曲,我不小心把資料庫date_created,寫成data_created,導致error瘋狂出現,這時候只要把code修改好之後,再重複上面步驟重新生成資料庫就可以了!
實作Create功能
- 修改app.py,讓其讀取index中的form裡的資料,也就是POST過來的資料,所以app.route那行也要加上POST
- 收到資料後放入資料庫並commit
至於index.html
方面也要修改,附上完整程式碼以免遺漏
稍微渲染一下頁面
實作Delete功能
很簡單就可以實作了,一樣先在app.py
加上下面的method
然後在index.html
加入jinja2,把delete按鈕附近修改成這樣
這裡讓我覺得比較神奇的是/delete/{{task.id}}
,因為我們是用flask
繪製整個頁面,是直接把資料庫拉過來,然後利用jinja
讓資料都顯示出來,所以想當然爾task
的id
也一併被拉過來了,因此就可以直接使用task.id
附上該task
的id
這裡我想整理一下delete
的流程
- 按下
delete
按鈕後,會觸發/delete/{{task.id}}
這個連結
- 然後就會觸發
delete method
,在app.py
裡面,這時id
也會傳到該method
裡
- 待資料庫操作完後,指定的
task
被刪除,這時會redirect
回主頁面,會觸發index()
,在app.py
裡
- 因為是
GET
所以會到else
的程式碼塊裡面,也就是取得所有tasks
,然後傳給html
顯示,如此一來就可以完成頁面的更新
實作Update功能
- 新增
update function
在app.py
- 新增
update
頁面
- 修改
index.html
接著是給使用者的update
頁面
接著在index.html
做修改,以免遺漏所以把block body
的部分都貼上來了