最近Packtpub找到了我,讓我給他們新出版的關於Flask的書寫書評。Flask是一個很流行的Python框架。那本書是Ron DuPlain寫的《Flask 即時Web開發》。我決定把「30天學習30種新技術」挑戰的第三天花在Flask上。在本文中,我首先將介紹Flask框架的一些基本知識,而後提供一個短篇的書評。一樣,我也會把示例應用移植到OpenShift上。對於Flask而言我不是一個徹底意義上的新手,我也用它建立過示例應用。對我來講,這是一次很好的溫習。前端
給不瞭解這一系列文章的讀者:我正在嘗試「30天學習30種新技術」的挑戰。天天我會學習一種新技術,而後寫一篇文章介紹下我學到了什麼,我怎樣使用新學的工具。若是一天不夠一項技術,我會天天討論一個關於該項技術的子話題。python
有些開發者可能沒據說過Flask,我來簡單介紹一下吧。Flask是一個基於Python的微型的web開發框架。雖然Flask是微框架,不過咱們並不須要像別的微框架建議的那樣把全部代碼都寫到單文件中。畢竟微框架真正的含義是簡單和短小。咱們能夠從單文件架構開始工做,只用須要的特性。等咱們漸漸熟悉Flask以後,能夠將代碼提取成模塊,同時學習Flask提供的高級功能。Flask沒有給出關於文件架構的建議,可是在這篇文章的後面我會討論書中建議的文件架構。git
讓咱們看一段示例代碼吧:github
from flask import Flask app = Flask(__name__) @app.route('/', defaults={'name':"Guest"}) @app.route('/<string:name>' , methods=['GET']) def say_hello(name): return "Hello " + name if __name__ == "__main__": app.run(debug=True)
這個例子很簡單,可是頗有表達力。坐下來好好欣賞下。web
咱們來解釋一下上面的代碼吧:sql
第一行導入了Flask類,以便建立一個Flask應用的實例。數據庫
接下來一行咱們建立了一個Flask類的實例。這是一個WSGI應用實例。WSGI是「Web服務器網關接口」(Web Service Gateway Interface)的縮寫,同時也是架設web項目的Python標準。這一行要告訴Flask到哪裏去找應用所需的靜態資源和模板。在咱們的例子中,咱們傳遞了name
,讓Flask在當前模塊內定位資源。json
接着咱們定義了一些關於/
的路由。第一個路由是爲根路徑/
準備的,第二個則對應於相似/shekhar
、/abc
之類的路徑。對於/
路由,咱們將初始的name
設定爲Guest
。若是用戶訪問 http://localhost:5000/ ,那麼他會看到Hello Guest
。若是用戶訪問 http://localhost:5000/shekhar ,那麼他會看到 Hello shekhar
。flask
最後咱們使用python app.py
命令來啓動開發服務器,以運行應用。咱們把上面的代碼複製到app.py
文件中。咱們同時經過Debug=True
開啓了調試,這樣當意料以外的狀況出現時,瀏覽器就能夠提供一個交互式的調試器。開啓調試的另外一個好處是,改動文件 以後,服務會自動從新加載。咱們可讓調試器在後臺運行,而後繼續在咱們的應用上工做。這提供了高效的開發環境。你能夠問問Java開發者如何實現自動從新加載 :)segmentfault
關於Flask值得知道的一些事:
Flask由Armin Ronacher於2010年建立。
Flask的靈感來自Sinatra。(Sinatra是一個極力避免小題大做的建立web應用的Ruby框架。)
Flask依賴於兩個庫,一個是Werkzeug(Python的WSGI工具庫),一個是Jinja2(一個模板引擎)。
Flask遵循「約定優於配置」以及合理的默認值原則。
我決定學習Flask是由於:
易於學習: 我已有8年的Java開發經驗。所以學完了Python基礎以後我想接觸web開發。Flask很是易於使用,同時,正如我上面的示例代碼所展現的那樣,是一個簡單得要死的框架。我大腦很天然地就適應它了,使用Flask,我能夠更快地開發。
很是活躍、生機勃勃的社區:我和幾個Python的朋友交談過,每一個人都建議我從Flask入手。我也google過,我發現處處都說Flask是最好的現代web開發的Python框架。
快速建立REST API:我但願學習便於建立REST服務的框架。咱們上面展現的例子,能夠很容易地改爲返回json文檔的應用,只需使用Flask的jsonify
函數。將來的web應用將架構在REST後端和基於現代JawaScript MV*框架的前端。
280頁優質文檔,有不少例子。
Flask遵循「約定優於配置」。也有合理的默認值,好比靜態資源放置在static文件夾中。固然,大部分默認值是可覆蓋的。
如今讓咱們來看下這本書的一些細節吧。
這書屬於菜譜類,每節建立一個示例應用。全書僅78頁。
售價 $11。
做者爲Flask提交過補丁。
從virtualenv
起步,這是python開發的正道。避免污染主python環境。方便不一樣的項目採用不一樣版本的python。
使用最佳實踐,好比良好的目錄結構之類的。雖然Flask是一個微框架,可是咱們仍然應該爲應用設定良好的層次。開發企業應用的時候這頗有幫助。
介紹了一些我沒據說過的Flask功能和擴展。 好比介紹了Flask-Script擴展。Flask-Script支持爲Flask應用編寫外部的腳本。
詳細解釋了WTForms。WTForms有助於編寫基於表單的應用。
對於初學者而言,一些主題不夠清晰,相關知識也講得不夠。我就看不明白爲何要在Flask應用中使用子域名。
缺少Postgresql和Mysql之類真實數據庫的內容。雖然做者提到了使用不一樣的數據庫uri來鏈接Postgresql和Mysql,但沒有給出真實的例子。我更喜歡使用一個真實數據庫的例子,而不是把數據庫放在內存裏。固然,把數據庫放在內存裏對初學者來講更容易。
沒有提到REST服務:對於今時今日的應用而言,REST不可缺乏。使用Flask的一大優點就是咱們能夠利用它很方便地編寫REST服務。
沒有提到如何配合Flask使用MongoDB之類的NoSQL數據庫。
Flask框架的單元測試支持至關完善,可是做者沒有介紹。
沒有提到雲部署。在本文中,我將展現如何把書中提到的示例程序部署到OpenShift上。
那些想編寫傳統的基於RDBMS的web應用的Flask初學者會發現這本書頗有用。
開始使用Flask前咱們須要安裝Python和virtualenv。本文中使用的Python版本是2.7。
安裝flask:
$ mkdir schedulingapp
$ cd schedulingapp/ $ virtualenv venv --python=python2.7 $ . venv/bin/activate $ pip install flask
在上面的命令中,咱們首先建立了一個爲示例應用準備的目錄,而後激活了virtualenv。virtualenv有助於避免污染python主環境。這意味着不一樣的項目可使用不一樣的python版本。最後,咱們安裝了flask。pip install flask
會安裝最新的flask框架穩定版。
書中的示例程序是一個簡單的預定應用。註冊帳戶後,能夠登陸應用建立、修改、查看預定。使用以下命令能夠在本地運行應用:
$ git clone https://github.com/shekhargulati/instant-flask-web-development-book-app.git scheduleapp $ cd scheduleapp $ virtualenv venv --python=python2.7 $ . venv/bin/activate $ pip install -r requirements.txt $ python manage.py create_tables $ python manage.py runserver
而後就能夠在 http://127.0.0.1:5000 訪問應用了。用戶能夠註冊帳號,開始使用應用了。
很不錯。可是我打算把個人應用部署到雲端。咱們將在OpenShift上部署應用。OpenShift是一個開源、公開、可伸縮的PaaS(平臺即服務)。
在構建應用以前,咱們須要作些設置:
註冊一個OpenShift帳號。註冊是徹底免費的,Red Hat給每一個用戶三枚免費的Gear,能夠用Gear運行你的應用。在寫做此文的時候,每一個用戶能無償使用總共 1.5 GB 內存和 3 GB 硬盤空間。
安裝 rhc客戶端工具。rhc
是ruby gem,所以你的機子上須要裝有 ruby 1.8.7以上版本。 只需輸入 sudo gem install rhc
便可安裝 rhc 。若是你已經安裝過了,確保是最新版。運行sudo gem update rhc
便可升級。關於配置rhc命令行工具的詳細信息,請參考: https://openshift.redhat.com/community/developers/rhc-client-tools-install
使用 rhc 的 setup 命令配置你的 OpenShift 帳號。這個命令會幫助你建立一個命名空間,同時將你的ssh公鑰上傳至 OpenShift 服務器。
輸入以下命令便可將應用部署到 OpenShift:
rhc create-app schedapp python-2.7 postgresql-9.2 --from-code=https://github.com/shekhargulati/schedapp-openshift.git
這個命令將建立應用,設置公開的DNS,建立私有git倉庫,最後利用你的Github倉庫中的代碼來部署應用。應用能夠經過 http://schedapp-shekhargulati.rhcloud.com/ 訪問。
今天就到這裏了,歡迎反饋意見。