[新手Python 應用搭建指南] 4. 專案雲端佈屬 +新專案食譜選擇器
本系列文章我將手把手的帶你們完成應用程式專案。從選題,找資料,探索資料,最後進而搭建出應用並且部署在網頁上讓你可以秀給你的媽媽,老闆或是阿娜答。
關聯文章目錄
4篇轉職工具箱 Four weeks to reach even better
4篇新手Python 應用搭建指南
- python 基礎資料結構
- python if/ for /while
- python套件 pandas/ 專案老電影選擇器
- (本篇)專案雲端佈屬 +新專案食譜選擇器
好的教學應該像食譜,給你清晰的指引,用到的工具與明確的度量衡。希望我能讓任何人都可以像學做一道菜一樣開始你的程式學習之旅。
上次的教學,我們從已經學會怎麼像個資料科學家一樣工作,首先設定題目查找資料,定義關鍵的欄位,進行資料探索與預處理。使用pandas開啟與處理資料,並且使用streamlit來架構專案,讓專案可以用網頁的方式開啟與展示。
上面講到的這些就是資料科學的日常阿。現在我們只差臨門幾小步就可以讓結果呈現在網路上了。就讓我們一起進行吧~
- 創建github帳號
- 將專案資料夾上傳到github
- 創建streamlit帳號
- 指定streamlit與github連動的關係
github是程式碼的倉庫,可以起到分散式版本管理的功能。
另一方面,streamlit最棒的地方是當你設定跟github連動時,它會幫你監聽github的更新。當你把程式碼上傳到你的程式碼倉庫,streamlit會自動更新!! 專案在進行佈屬的時候,最擔心遺漏掉那些區塊忘記進行,而程式設計師的群體發明種種自動化就是為了避免犯錯(同時也是因為懶XD),streamlit 讓我們體會到自動化佈屬的好處,這部份我們後面也會示範
來深入討論一下github 的優點以及為什麼我們非用不可。設想一個情境,今天你寫好一段程式碼,結果測試的時候發現問題,而且改了太多東西一個頭兩個大,你心中冒出一個聲音,早知道別改了,先讓我回到昨天的版本吧。沒錯~ 版本管理最大的優勢就出來了,當你小步小步的更改你的程式碼,每一次告一小個段落,你就將可以跑的程式碼鎖定一個小版本,就像玩遊戲的時候你設定一個重生點一樣,等等事態不對的時候你隨時可以回到你這個小版本來。
也許有人會說,那我就ctrl-c ctrl-v 就好了。git版本控管的好處是它的這些備份都有跡可循,你隨時可以回到過去的版本查看並隨時還原任何時刻的版本,在此強大功能下,你可以只佔用一倍的檔案空間,如果使用複製貼上大法的人可能已經被檔案容量不足所苦,更可怕的是,你可能每存一次就在後面加一個<檔名_new.py>你可能最後就會一堆 <project_new_modified_final_new_002_final.py>你都忘了這個到底new 還是final。
透過git的版本管理,你可以只保留一份檔案,一個檔名,而且還可以綜觀其每一行程式碼被修改的歷史。
有時候看到一條寫得很醜很不合理的code就上去blame一下(git blame可以看到該檔案指定行數的修改紀錄) 發現那個糟糕的程式碼就是自己推上去的=P,搭時光機回去掐死過去的自己吧,好吧這一定是自己有在進步的證明(或自我安慰)。
總而言之,git版本管理工具,真的是現代程式開發者的福音,並且在多人協作的時候可以起到非常關鍵的輔助效果(這是後話,有機會再多解釋解釋)
下面介紹帳號創建流程
github ,現在帳號建立竟然是互動式介面,好像在打電動阿,按照步驟一步一步就可以完成創建
streamlit ,拿上面創建好的github帳號,來進行連動綁定就行,當年我創streamlit帳號的時候需要人工審核,大約需要一天的時間不確定現在帳號創建是怎麼樣的機制(畢竟被snowflake併購等等)規則可能已經不太一樣,有成功的朋友麻煩再跟我update一下。當初一個streamlit帳號只能開3個app,現在可以免費開無限個(我也是因為當初只能佈3個app,因為專案創意太多只好學著怎麼用heroku,並且讓streamlit app可以快速佈屬到heroku上面,有機會也可以再專文一篇分享)
現在我們兩個帳號都開通好了之後就可以開始進行github專案建立與控管了。
… 實作畫面…
- 登入github後點選綠色的按鈕開新專案
2. 新增專案名字,以imdb_st為例(這個專案名字不需要全網域獨一無二,只要自己沒有創建過同名專案就可以,舉例來說,網路上可能已經很多叫imdb_st的專案,但只要我沒有創建過同名的專案,我仍然可以創建)
創建之後我們要跟streamlit進行專案連動,也將以這個名字為基準
2. 沒什麼問題就往下滑,按綠按鈕創建
之後會進到這個畫面,這個畫面很新手友善,可以參考一下,裡面需要安裝git(還沒安裝的點這個連結),由於我們專案資料夾還是空的,可以先採用第一個方案
第一次做我們可以選擇複製上面提示的那段程式碼到terminal貼上(windows的使用者最好使用git bash 以免會有很多linux指令無法執行)
對了,記得先創建專案資料夾
mkdir -p workspace/imdb_st
cd workspace/imdb_st
之後再貼上下方這些copy來的code
過程中可以考慮認證登入,這樣之後要推code比較方便,這是vscode一個很方便的小功能
看到上面的畫面就是成功了
這時再進到專案資料夾,就可以看到已經順利更新了,當我們按下重新整理,就可以看到畫面不同了
這時我們先回到上禮拜的進度,往下滑到最下面應該有個寫好的code (連結)
接著就照著上週的進度,創建requirements.txt(目前只用到streamlit,需要放streamlit), 將下載好的csv移入,以及最後的將app.py貼上
我們這時候打status就會看到三個需要增加的檔案
接下來我們需要
- git add .
- git commit -m “commit message”
- git push
增加檔案到等待commit 的區域,之後commit變更並附上commit message
在公司的專案我們必須要針對每個commit解釋為什麼(WHY)需要變更,以及如何(How)你做了什麼來變更.之後可以出git的專文詳細解釋,現在就讓我們快速進到下一步吧
最後則是push 這些變更到git伺服器
commit message 可以打你要的,在這裡我暫時留“讓file 跟上一週同步”,簡單的解釋我這個commit在做什麼
這時候我們再回去看github的時候就會發現,很棒,都已經update好了(記得F5重新整理)
至此code的部分告一個段落,接下來我們來看我們的streamlit要做什麼吧
首先打開streamlit,登入後點選藍色大大的new app
接下來到repository的地方點選你要跟streamlit同步的github專案名稱,我剛剛創的是imdb_st,因此我就點下此專案,最下方的app.py是因為我的專案主要的檔案名字是取作app.py,所以如果你們想要用不同名字,要記得改一下名字。 確認一下沒問題就可以按下Deploy!了
接著你就會看到很可愛的做蛋糕畫面,你的app正在烘培中呦
好了之後你的app就會跳出來了,成功!
專案的網址也會貼合著你的github專案,是不是很可愛呢
https://share.streamlit.io/yz830620/imdb_st/main/app.py
這樣佈屬的部分已經告一個段落了,真正的做到一鍵懶人部署
這時候我們發現一個問題,時間如果顛倒的時候,會噴錯給使用者看
那我就來帶你們解決這個問題,順便示範怎麼動態變更,動態部署
我發現我的app.py中的41行有一些typo導致它出了問題
我們來將其改正,改完記得ctrl + s存檔
我們可以在命令列輸入 git diff 來診斷有改了哪些地方
看起來就剛好是我們改的這行,沒錯
接下來就是 add, commit, push 一條龍
再回來我們的github專案就可以看到有正確的上傳了(1分鐘前更新)
接下來你可能會覺得要開始頭痛了,機器已經部署了,要怎麼解除要怎麼link unlink,然而streamlit的聰明讓我們完全避免做那些事情,他會自動來監聽我們這個imdb_st專案有沒有變化,如果今天你有push新的版本上去,當他發現現在最新的版本跟他手上的不一樣,它就會自動的幫你下載並且重啟服務。
重新去一下服務地址,太棒了,正常工作
今天的篇幅有點多,需要整合很多專案的知識,我們今天就先講解到這邊,希望大家都能抽空練習,至於食譜的專案,我之後會抽空在專文寫一篇,大家帶著這次練習的機會,一起打鐵趁熱做出不同的有趣應用吧。有任何收穫或是有趣的專案都歡迎跟我分享歐
以往覺得很困難的網路服務部署隨著科技發達越來越簡單,我最近甚至買了自己的網域(evenpan.com)也買了虛擬機部署一堆服務在上面,之後會再寫更多專文教學如何自己hardcore的搞出那些,真的需要花很多時間研究呢。 不過目前這個streamlit 的服務一個按鈕自己就可以啟動成https服務,自己的伺服器要做成這些功能就會花費更多功夫。但是擁有這一切就像有自己的孩子一樣讓人開心,每天都可以幫它加上更多功能,讓它更加強大,並且幫你處理更多問題,這一切真的很讓人興奮。
順帶一提,因為疫情的關係,我暫時手邊沒有自己的windows電腦,所以今天的vscode 環節包括git 都是我用虛擬機完成的,其實是run在linux上面的服務。想學怎麼做的記得持續追蹤我的頻道啦~~
新手python 四篇正式下課,
恭喜,你現在也是個有服務的男人/女人了,下次可以拍著胸脯跟別人大聲說話,來比服務啊!!!