Flask的優(yōu)點(diǎn):
1.簡單。flask是主要應(yīng)對(duì)小型或者快速構(gòu)建的項(xiàng)目,故沒有像Django那樣大而全,集成了很多的組件,不管你是否用沒用得到。如果說Django是一個(gè)精裝的房子,那么flask就是毛培房。使用Django的項(xiàng)目,大部分的布局等都是相似的,因?yàn)橐呀?jīng)裝修完畢了,大同小異。而使用flask的話,如何裝修,如何設(shè)計(jì)都是自己搞定的,所以每個(gè)flask項(xiàng)目的相異性較大。
2.使用簡單。官方的使用指南清晰的介紹了Flask的運(yùn)行過程。官方指南(中文版)
3.部署簡單。本地運(yùn)行不需要安裝其他的軟件,只需要python基本的環(huán)境(一般來說:本地測(cè)試直接運(yùn)行即可)。如需要在服務(wù)器上運(yùn)行,以支撐起整個(gè)項(xiàng)目,則需要配置uwsgi+nginx。因?yàn)樾枰紤]到并發(fā)性、異步性(盡管可以在啟動(dòng)run()里加入一些參數(shù)實(shí)現(xiàn)異步)。
Flask的安裝
Flask安裝教程(包含多種安裝方式),建議不要直接pip,而是先安裝:虛擬環(huán)境創(chuàng)建工具virtualenv,為每一個(gè)項(xiàng)目創(chuàng)建一個(gè)虛擬環(huán)境,這樣不會(huì)引起版本沖突。
pip install virtualenv? ---安裝虛擬環(huán)境
cd your_project_dir? ---進(jìn)入你的項(xiàng)目目錄
virtualenv? venv---創(chuàng)建目錄名(自定義),在venv文件夾中,包含了python的可執(zhí)行文件,以及pip庫的拷貝,這樣就可以安裝flask包了,前提是激活該項(xiàng)目的虛擬環(huán)境,否則還是會(huì)安裝在系統(tǒng)環(huán)境下
source venv/bin/activate? ?---激活虛擬環(huán)境
服務(wù)器上配置:
uwsgi+nginx配置,如果不使用Nginx也是可以實(shí)現(xiàn)項(xiàng)目的運(yùn)行支撐的,但是Nginx可以保證負(fù)載均衡(如果有多個(gè)運(yùn)行項(xiàng)目的話)以及安全性。一般配置nginx作為前端代理,uwsgi作為后端代理,其實(shí)這樣稱呼并不準(zhǔn)確,但只是相對(duì)的。nginx用來處理靜態(tài)請(qǐng)求,若是動(dòng)態(tài)請(qǐng)求由nginx轉(zhuǎn)發(fā)至uwsgi進(jìn)行處理。具體作用見:NgInx的作用。
先安裝uwsgi,可直接pip系統(tǒng)安裝,或者在虛擬環(huán)境中安裝;
pip install uwsgi?
????????在你的項(xiàng)目根目錄下創(chuàng)建一個(gè)uwsgiconfig.ini(uwsgi支持多種配置文件格式:ini、xml、json等),其實(shí)不是必須在根目錄下創(chuàng)建,只要能找到該文件并啟動(dòng)即可,在根目錄下創(chuàng)建是方便修改。

Nginx安裝:參考:nginx安裝及基本操作語法
????????nginx的配置文件:可能存在大量的注釋,我們需要放開注釋并且可能進(jìn)行修改;這里就不全部顯示了,僅介紹主要的配置:

????????只要我們把代碼上傳到服務(wù)器上,運(yùn)行uwsgiconfig.ini文件,即可讓我們的flask項(xiàng)目運(yùn)行,并能向前提供服務(wù)。但在開發(fā)過程中,我們每次修改代碼或者新增功能并且在本地測(cè)試好了之后,想要通過公網(wǎng)訪問我們的修改的或者新增的功能,就得把當(dāng)前改變上傳到服務(wù)器上,并且重新啟動(dòng)uwsgi服務(wù)器。這樣每次代碼有改動(dòng),都得先上傳到服務(wù)器,再重新啟動(dòng)uwsgiconfig.ini文件,很是麻煩,所以我們期望找到一種自動(dòng)化的工具,能幫我們自動(dòng)上傳代碼,重新啟動(dòng)uwsgi服務(wù)器,jenkins就是我們所需要的工具。
代碼托管平臺(tái):github、coding、Bitbucket等:
? ? ? ?也就是將你的項(xiàng)目放在托管平臺(tái)上進(jìn)行托管,方便協(xié)作開發(fā),代碼集成。這里是用了coding做說明,后面將說明coding的一些配置。
jenkins持續(xù)集成:
?jenkins安裝配置:
注意jenkins是基于java的,所以需要jdk環(huán)境并且在jenkins配置文件中設(shè)置。
service jenkins start? ?---啟動(dòng)jenkins?
在瀏覽器輸入? http://公網(wǎng)ip: 8080 (默認(rèn))訪問jenkins頁面(php界面)。
1.安裝jenkins需要的插件: 系統(tǒng)管理->插件管理->可選插件->右上角搜索:
? ? coding_webhook插件通過與coding上的項(xiàng)目的hook建立鏈接,當(dāng)coding上代碼有更新時(shí),jenkins也會(huì)進(jìn)行更新;publish_over_ssh插件是用來實(shí)現(xiàn)遠(yuǎn)程部署。


2.系統(tǒng)配置:
? ? ? ? ? 首先,在服務(wù)器上生成公鑰:ssh-keygen -t rsa? ;按3個(gè)回車,密碼為空。默認(rèn)會(huì)在 ~/.ssh目錄生成兩個(gè)文件: id_rsa私鑰,id_rsa.pub公鑰。known_hosts文件會(huì)記錄ssh密鑰登陸的主機(jī)列表。
? ? ? ? ? 接著,在系統(tǒng)管理->系統(tǒng)配置的publish_over_ssh中:

? ? ? ?在remote_directory下面的高級(jí)中:

然后保存即完后ssh的配置;
構(gòu)建項(xiàng)目:
新建任務(wù)->:

基礎(chǔ)設(shè)置:

源碼管理:

觸發(fā)器構(gòu)建:

觸發(fā)器構(gòu)建時(shí),需要配置coding上的webhook:

觸發(fā)器設(shè)置:

構(gòu)建環(huán)境:不做任何改變
構(gòu)建:
選擇增加構(gòu)建后操作,方式選擇SSH,目的是為了讓服務(wù)器重啟uwsgiconfig.ini文件,實(shí)現(xiàn)自動(dòng)化部署。

最后保存即可;
run.sh腳本說明:

到此,你的代碼在托管工具coding上更新之后,會(huì)通知綁定的jenkins,jenkins一并更新,并上傳到服務(wù)器指定目錄,最后通過執(zhí)行腳本重啟uwsgi服務(wù)器,實(shí)現(xiàn)自動(dòng)化部署。
注意事項(xiàng):
????????flask項(xiàng)目的啟動(dòng)文件的應(yīng)用變量中的參數(shù)應(yīng)該設(shè)置0.0.0.0或者不設(shè)置,也不要設(shè)置成調(diào)試模式,否則公網(wǎng)可能訪問不到;(這里沒有去了解參數(shù)設(shè)置,僅僅是隨便看了網(wǎng)上的一些解決方法照搬的);
????????服務(wù)器上也要安裝git,同時(shí)在jenkins全局工具管理中配置;
????????首次登錄jenkins之后密碼可能會(huì)消失,如果你記不得了的話,按照這個(gè)方法進(jìn)行重新配置;管理員密碼重置
????????如果自動(dòng)化部署沒問題,代碼在本地也沒問題,上傳上去發(fā)現(xiàn)項(xiàng)目運(yùn)行報(bào)錯(cuò),排除bug等原因。那么可能是py包的問題,我就遇到了包的版本問題,最后發(fā)現(xiàn)是pymongo的2.8之前不兼容;
????????在uwsgi配置中你指定的運(yùn)行日志文件中,可以看到報(bào)錯(cuò)的信息,shift+g可以跳轉(zhuǎn)到底部查錯(cuò);
? ? ? ? 時(shí)間過得有點(diǎn)久了,所以可能一些細(xì)節(jié)沒解釋清楚或者錯(cuò)了,但總體方向還是對(duì)的,希望大家不要建議。