在這一章,你將學習Flask應用程序不一樣部分。同時你將編寫和運行你的第一個Flask web應用程序。python
在這章,你將學到Flask應用程序的不一樣部分。同時,你將編寫和運行你的第一個Flask web應用程序。git
全部的Flask應用程序都必須建立一個 應用程序實例 。使用web服務器網關接口協議將全部從客戶端接收的請求傳遞給這個對象處理。這個應用程序實例就是Flask類的一個對象,一般使用下面的方式建立:github
from flask import Flask app = Flask(__name__)
Flask類構造函數惟一須要的參數就是應用程序的主模塊或包。對於大多數應用程序,Python的__name__
變量就是那個正確的、你須要傳遞的值。web
注:對於Flask開發者來講,傳給Flask應用程序構造函數的
name
參數是比較容易弄混淆的。Flask使用這個參數來肯定應用程序的根目錄,這樣之後能夠相對這個路徑來找到資源文件。flask
稍後你能夠看到更復雜的應用程序實例初始化,可是對於簡單應用程序這些已經足夠了。瀏覽器
客戶端例如web瀏覽器發送 請求 給web服務,進而將它們發送給Flask應用程序實例。應用程序實例須要知道對於各個URL請求須要運行哪些代碼,因此它給Python函數創建了一個URLs映射。這些在URL和函數之間創建聯繫的操做被稱之爲 路由 。服務器
在Flask應程序中定義路由的最便捷的方式是經過顯示定義在應用程序實例之上的app.route
裝飾器,註冊被裝飾的函數來做爲一個路由。下面的例子會演示怎樣使用裝飾器來申明一個路由:app
@app.route('/') def index(): return '<h1>Hello World!</h1>'
注:裝飾器是Python語言的標準特性;它們能夠以不一樣方式改變函數的行爲。一個常見的模式是使用裝飾器來註冊函數做爲一個事件處理程序。函數
在上一個示例給應用程序的根URL註冊index()
函數做爲事件的處理程序。若是這個應用程序被部署在服務器上並綁定了 www.example.com 域名,而後在你的瀏覽器地址欄中輸入 http://www.example.com 將觸發index()
來運行服務。客戶端接收到的這個函數的返回值被稱爲 響應 。若是客戶端是web瀏覽器,響應則是顯示給用戶的文檔。學習
相似於index()
的函數被稱做 視圖函數 。經過視圖返回的響應能夠是簡單的HTML內容的字符串,但它也能夠市更復雜的形式,正如您將看到的。
注:響應字符串嵌入在Python代碼中致使代碼難以掌控,在此只是介紹響應的概念。你將在第三章學習正確的方法來生成響應。
若是你注意到你天天使用的一些網站URLs如何造成的,你將會發現不少都有變量。例如,你的Facebook我的信息頁的URL是 http://www.facebook.com/<username> ,因此你的用戶名是它的一部分。Flask在路由裝飾器中使用特殊的語法支持這些類型的URLs。下面的示例定義了一個擁有動態名稱組件的路由:
@app.route('/user/<name>') def user(name): return '<h1>Hello, %s!</h1>' % name
用尖括號括起來的部分是動態的部分,因此任何URLs匹配到靜態部分都將映射到這個路由。當視圖函數被調用,Flask發送動態組件做爲一個參數。在前面的示例的視圖函數中,這個參數是用於生成一個個性的問候做爲響應。
在路由中動態組件默認爲字符串,可是能夠定義爲其餘類型。例如,路由/user/<int:id>
只匹配有一個整數在id動態段的URLs。Flask路由支持int、float和path。path一樣是字符串類型,但並不認爲斜槓是分隔符,而認爲它們是動態組件的一部分。
應用程序實例有一個run
方法用於啓動Flask集成的web服務:
if __name__ == '__main__': app.run(debug=True)
__name__ == '__main__'
在此處使用是用於確保web服務已經啓動當腳本被當即執行。當腳本被另外一個腳本導入,它被看作父腳本將啓動不一樣的服務,因此app.run()
調用會被跳過。
一旦服務啓動,它將進入循環等待請求併爲之服務。這個循環持續到應用程序中止,例如經過按下Ctrl-C
。
有幾個選項參數能夠給app.run()
配置web服務的操做模式。在開發期間,能夠很方便的開啓debug模式,將激活 debugger 和 reloader 。這樣作是經過傳遞debug爲True來實現的。
注:Flask提供的web服務並不用於生產環境。你將在十七章學習生產環境的web服務。
在上一節,你學習了Flask web應用程序的不一樣部分,如今是時候寫一個了。整個 hello.py 應用程序腳本只不過將前面描述的三個部分結合在一個文件中。應用程序示例2-1所示。
示例2-1 hello.py:一個完整的Flask應用程序
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return ' <h1>Hello World!</h1> ' if __name__ == '__main__': app.run(debug=True)
建議:若是你有克隆在GitHub上的應用程序,你如今能夠運行
git checkout 2a
來切換到這個版本的應用程序。
運行應用程序以前,請確保你在以前建立的虛擬環境已是激活狀態且已安裝Flask。如今打開你的web瀏覽器並在地址欄輸入 http://127.0.0.1:5000/ 。圖像2-1顯示鏈接到應用程序後的web瀏覽器。
圖像2-1 hello.py Flask應用程序
而後輸入如下命令啓動應用程序:
(venv) $ python hello.py * Running on http://127.0.0.1:5000/ * Restarting with reloader
若是你輸入任何其餘URL,應用程序將不知道如何操做它而且將返回錯誤代碼404給瀏覽器——當你訪問一個不存在的網頁也會獲得該錯誤。
示例2-2所示應用程序的加強版添加了第二個動態路由。當你訪問這個URI,你應該能夠看到一個個性的問候。
示例2-2 hello.py:帶有動態路由的Flask應用程序
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return ' <h1>Hello World!</h1> ' @app.route('/user/<name>') def user(name): return ' <h1>Hello, %s!</h1> ' % name if __name__ == '__main__': app.run(debug=True)
建議:若是你有克隆在GitHub上的應用程序,你如今能夠運行
git checkout 2b
來切換到這個版本的應用程序。
測試動態路由,確保服務正在運行隨後訪問 http://localhost:5000/user/Dave 。生成的應用程序會使用動態參數名響應一個定製的問候。嘗試不一樣的名稱,看看視圖函數老是生成響應基於給定的名稱。圖像2-2展現的一個示例。
圖像2-2 hello.py 動態路由