用 Python 開(kāi)發(fā)一個(gè) 【個(gè)人計(jì)劃 todolist】
有一句話是這樣說(shuō)的:“凡事預(yù)則立,不預(yù)則廢”,說(shuō)的是我們?cè)谧鍪轮?,最好制定好你的?jì)劃,然后有序的去執(zhí)行,這樣不會(huì)產(chǎn)生過(guò)多的錯(cuò)誤和不爽,如果什么都不準(zhǔn)備的話,人就容易廢掉。
今天,你廢了么?
為了讓我們不要那么快的廢掉,要不我們用 Python 來(lái)寫一個(gè)網(wǎng)頁(yè)版的 todolist, 然后在里面制定自己的計(jì)劃怎么樣?
可能你會(huì)想到像這種簡(jiǎn)單一些的網(wǎng)頁(yè)交互,可以用 Flask 來(lái)實(shí)現(xiàn),不過(guò)小帥b今天要給你介紹的是另一個(gè)輕量級(jí)的 web 框架,它叫 bottle ,知道的人相對(duì)較少,但它也是很好用的呢。
我們要在網(wǎng)站里面寫入計(jì)劃內(nèi)容,就需要用到數(shù)據(jù)庫(kù),我們也可以使用輕量級(jí)的 sqlite 數(shù)據(jù)庫(kù)實(shí)現(xiàn),這個(gè) Python 有自帶的 sqlite3 庫(kù)。
可以使用它來(lái)創(chuàng)建一張 todo 數(shù)據(jù)表:
其中的 task 字段主要是用來(lái)存放用戶要添加的計(jì)劃內(nèi)容, status 用來(lái)標(biāo)記用戶是否完成計(jì)劃的狀態(tài),比如 1 表示未完成, 0 表示已經(jīng)完成。
可以通過(guò) insert 插入每一條任務(wù)的數(shù)據(jù):
執(zhí)行:
這時(shí)候在你當(dāng)前的目錄下就會(huì)生成一個(gè)數(shù)據(jù)庫(kù)文件,等會(huì)所有的計(jì)劃數(shù)據(jù)都存儲(chǔ)在這里面:
如果你之前沒(méi)有安裝過(guò) bottle ,可以使用 pip 安裝一波,它沒(méi)有依賴其它的庫(kù),安裝很快就能搞定。
安裝完成之后導(dǎo)入 bottle:
定義路由,當(dāng)你訪問(wèn) /todo 首頁(yè)的時(shí)候就會(huì)調(diào)用這個(gè)方法:
這時(shí)候可以連接我們剛剛創(chuàng)建數(shù)據(jù)庫(kù),順便將未完成的任務(wù)查找出來(lái),然后將結(jié)果返回進(jìn)行顯示:
接著執(zhí)行服務(wù),你可以自己指定運(yùn)行在服務(wù)器上的什么端口上,這里我指定為 8888 端口:
運(yùn)行 Python 之后,就可以在瀏覽器打開(kāi):localhost:8888/todo
可以看到,我們剛剛插入的數(shù)據(jù)顯示出來(lái)了,說(shuō)明服務(wù)和數(shù)據(jù)庫(kù)運(yùn)行正常。
那么接下來(lái)就把數(shù)據(jù)顯示到首頁(yè),可以使用 bottle 的模板引擎實(shí)現(xiàn)數(shù)據(jù)的綁定,在當(dāng)前的目錄下創(chuàng)建一個(gè) make_table.tpl 文件。
這里我們使用了 HTML 的模板標(biāo)記語(yǔ)言,我們可以在剛剛的 Python 文件中將在數(shù)據(jù)庫(kù)中得到的結(jié)果寫到 rows 里面,然后在?make_table 模板文件中就可以使用它循環(huán)得到相關(guān)的數(shù)據(jù)了:
運(yùn)行一波:
數(shù)據(jù)成功綁定。
接下來(lái)插入計(jì)劃的內(nèi)容,可以使用 bottle 的 request 做 Get 和 Post 請(qǐng)求。
創(chuàng)建一個(gè) new_task.tpl 模板文件:
這里定義了一個(gè) form 表單,讓它去請(qǐng)求 new 方法,可以在 py 中定義這個(gè)方法,先來(lái)展示看看:
運(yùn)行一波:
那么當(dāng)用戶點(diǎn)擊提交的時(shí)候,需要將輸入框的內(nèi)容獲取,然后保存到數(shù)據(jù)庫(kù)中,可以在 new 方法中這樣定義:
這里主要是通過(guò) GET.task 來(lái)獲取輸入框的數(shù)據(jù),然后將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中,添加成功后顯示一個(gè)成功添加的提醒。
運(yùn)行一下:
可以可以,回到首頁(yè)可以看到數(shù)據(jù)確實(shí)添加了:
可以添加計(jì)劃了,接下來(lái)要實(shí)現(xiàn)的是對(duì)計(jì)劃的編輯,可以讓用戶選擇每條計(jì)劃是否完成了,以及修改計(jì)劃的內(nèi)容:
可以寫一個(gè) edit_task.tpl 模板文件來(lái)進(jìn)行數(shù)據(jù)的展示和提交:
這里的 form 表單綁定的請(qǐng)求是 edit 方法,其中 {{no}} 指的是計(jì)劃表中的 id,這樣就能根據(jù) id 來(lái)修改特定的計(jì)劃數(shù)據(jù)。
想要在 input 標(biāo)簽中顯示相關(guān)的計(jì)劃內(nèi)容和狀態(tài),可以在 py 里面通過(guò)數(shù)據(jù)庫(kù)獲取然后返回,放到 old 參數(shù)中,像這樣:
而當(dāng)用戶進(jìn)行編輯操作提交的時(shí)候,可以將計(jì)劃的內(nèi)容和狀態(tài)獲取過(guò)來(lái),然后根據(jù) id 來(lái)修改數(shù)據(jù)庫(kù)中的計(jì)劃數(shù)據(jù):
在 route 定義那里的
運(yùn)行一波就是這樣:
回到首頁(yè)可以看到已經(jīng)完成的計(jì)劃就消失了:
這樣,一個(gè)個(gè)人計(jì)劃所需的主要功能就實(shí)現(xiàn)了呀~當(dāng)然頁(yè)面有點(diǎn)丑陋,可以用 css 來(lái)裝飾一下,這個(gè)交給你自己玩玩,這次主要是想讓你了解 bottle 的使用,等會(huì)我把源碼都發(fā)你,你可以基于此做更多的改進(jìn)。
對(duì)于每個(gè)任務(wù)的內(nèi)容,也可以寫一個(gè)方法進(jìn)行查詢,甚至你還可以使用 bottle 寫一個(gè) API 直接返回 Json:
這時(shí)候可以這樣訪問(wèn)接口:
當(dāng)然你可以快速自定義 404 頁(yè)面,使用 bottle 的 error 模塊實(shí)現(xiàn):


ok,以上。
ps:本篇教程主要參考至 bottle 官方文檔的教程,附上 bottle 的官方文檔鏈接:
http://bottlepy.org/docs/dev/index.html
小帥b希望以這樣的呈現(xiàn)方式讓你更輕松的了解 bottle 這個(gè)輕量級(jí)?web 框架的使用,除了 Flask 外,這個(gè)也是挺不錯(cuò)的選擇哦,寫一些網(wǎng)頁(yè)還是杠杠的,希望對(duì)你有幫助,那么我們下回見(jiàn)咯~
本文所涉及的源碼可以在公眾號(hào)后臺(tái)發(fā)送 6 獲取。
相關(guān):
用 Python 開(kāi)發(fā)一個(gè)【短鏈接生成器】
用 Python 開(kāi)發(fā)一個(gè)微信留言小程序
peace!
