摘要:注對于開發者來說,傳給應用程序構造函數的參數是比較容易弄混淆的。在應程序中定義路由的最便捷的方式是通過顯示定義在應用程序實例之上的裝飾器,注冊被裝飾的函數來作為一個路由。一個常見的模式是使用裝飾器來注冊函數作為一個事件處理程序。
在這一章,你將學習Flask應用程序不同部分。同時你將編寫和運行你的第一個Flask web應用程序。
1、初始化在這章,你將學到Flask應用程序的不同部分。同時,你將編寫和運行你的第一個Flask web應用程序。
所有的Flask應用程序都必須創建一個 應用程序實例 。使用web服務器網關接口協議將所有從客戶端接收的請求傳遞給這個對象處理。這個應用程序實例就是Flask類的一個對象,通常使用下面的方式創建:
from flask import Flask app = Flask(__name__)
Flask類構造函數唯一需要的參數就是應用程序的主模塊或包。對于大多數應用程序,Python的__name__變量就是那個正確的、你需要傳遞的值。
注:對于Flask開發者來說,傳給Flask應用程序構造函數的name參數是比較容易弄混淆的。Flask使用這個參數來確定應用程序的根目錄,這樣以后可以相對這個路徑來找到資源文件。
稍后你可以看到更復雜的應用程序實例初始化,但是對于簡單應用程序這些已經足夠了。
2、路由和視圖函數客戶端例如web瀏覽器發送 請求 給web服務,進而將它們發送給Flask應用程序實例。應用程序實例需要知道對于各個URL請求需要運行哪些代碼,所以它給Python函數建立了一個URLs映射。這些在URL和函數之間建立聯系的操作被稱之為 路由 。
在Flask應程序中定義路由的最便捷的方式是通過顯示定義在應用程序實例之上的app.route裝飾器,注冊被裝飾的函數來作為一個路由。下面的例子會演示怎樣使用裝飾器來申明一個路由:
@app.route("/") def index(): return "Hello World!
"
注:裝飾器是Python語言的標準特性;它們可以以不同方式改變函數的行為。一個常見的模式是使用裝飾器來注冊函數作為一個事件處理程序。
在上一個示例給應用程序的根URL注冊index()函數作為事件的處理程序。如果這個應用程序被部署在服務器上并綁定了 www.example.com 域名,然后在你的瀏覽器地址欄中輸入 http://www.example.com 將觸發index()來運行服務。客戶端接收到的這個函數的返回值被稱為 響應 。如果客戶端是web瀏覽器,響應則是顯示給用戶的文檔。
類似于index()的函數被稱作 視圖函數 。通過視圖返回的響應可以是簡單的HTML內容的字符串,但它也可以市更復雜的形式,正如您將看到的。
注:響應字符串嵌入在Python代碼中導致代碼難以掌控,在此只是介紹響應的概念。你將在第三章學習正確的方法來生成響應。
如果你注意到你每天使用的一些網站URLs如何形成的,你將會發現很多都有變量。例如,你的Facebook個人信息頁的URL是 http://www.facebook.com/
@app.route("/user/") def user(name): return " Hello, %s!
" % name
用尖括號括起來的部分是動態的部分,所以任何URLs匹配到靜態部分都將映射到這個路由。當視圖函數被調用,Flask發送動態組件作為一個參數。在前面的示例的視圖函數中,這個參數是用于生成一個個性的問候作為響應。
在路由中動態組件默認為字符串,但是可以定義為其他類型。例如,路由/user/
應用程序實例有一個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來實現的。
4、一個完整的應用程序注: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 "Hello World!
" 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 "Hello World!
" @app.route("/user/") def user(name): return " Hello, %s!
" % name if __name__ == "__main__": app.run(debug=True)
建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 2b來切換到這個版本的應用程序。
測試動態路由,確保服務正在運行隨后訪問 http://localhost:5000/user/Dave 。生成的應用程序會使用動態參數名響應一個定制的問候。嘗試不同的名稱,看看視圖函數總是生成響應基于給定的名稱。圖像2-2展示的一個示例。
圖像2-2 hello.py 動態路由
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37419.html
摘要:有兩類應用級和請求級。一個響應中非常重要的部分是狀態碼,默認設置來指示請求已經成功處理。重定向通常由響應狀態碼注明并且重定向的由頭部的給出。因為這些變化,應用程序獲得一組基本的命令行選項。運行顯示可用信息在應用程序上下文的內部運行一個。 5、請求-響應循環 現在你已經玩過一個基本的Flask應用程序,你也許想要知道更多關于Flask如何施展魔力。下面章節描述了一些框架設計方面的特點。...
摘要:被定義在包的構造函數中的應用程序工廠函數會在示例中展示。這個構造函數導入大部分當前需要使用的擴展,但因為沒有應用程序實例初始化它們,它可以被創建但不初始化通過不傳遞參數給它們的構造函數。而應用程序范圍內的錯誤處理則必須使用。 雖然小型web應用程序用單個腳本可以很方便,但這種方法卻不能很好地擴展。隨著應用變得復雜,在單個大的源文件中處理會變得問題重重。 與大多數其他web框架不同,Fl...
摘要:單元測試這個應用非常小以至于不需要太多的測試,但是作為示例會在示例中展示兩個簡單的測試定義。示例單元測試編寫好的測試使用的是來自于標準庫中標準的包。為了運行單元測試,可以在腳本中增加一個自定義的命令。 4、啟動腳本 頂層目錄中的manage.py文件用于啟動應用。這個腳本會在示例7-8中展示。 示例7-8. manage.py:啟動腳本 #!/usr/bin/env python im...
摘要:示例使用的模板的指令通過從引用來實現模板的繼承。上面的模板定義了三個,分別命名為和。同時返回相應錯誤的數字狀態碼。示例帶有導航欄的基礎應用程序模板這個模板中的塊中只是一個名為的元素,它包含了在派生模板中定義的名為的空。 2、集成Twitter Bootstrap的Flask-Bootstrap Bootstrap是Twitter的一個開源框架,提供用戶交互組件來創建一個清新且有吸引力...
摘要:用真實的值替換變量并返回最終響應字符串,這個過程稱為渲染。示例展示模板實現該響應。控制結構提供一些控制結構用于改變模板流。這個示例展示如何使用循環做到這些同樣支持宏,這和代碼中的函數很像。 寫代碼最關鍵的是要易于維護且結構清晰整潔。目前為止,你看到的例子都過于簡單從而沒有做這方面的要求。Flask視圖函數希望將兩個應該完全獨立的任務一并處理,兩個任務有兩種代碼,一并處理勢必會引發問題。...
閱讀 1026·2021-11-23 09:51
閱讀 2344·2021-10-08 10:22
閱讀 2544·2021-09-29 09:35
閱讀 854·2021-09-22 15:20
閱讀 2859·2019-08-30 15:53
閱讀 2413·2019-08-30 13:55
閱讀 1097·2019-08-29 17:27
閱讀 2870·2019-08-29 17:26