Flask學習
來自: https://segmentfault.com/a/1190000004512699
Web框架
Web框架是構建Web應用的一種方式。盡管現在很多語言如PHP、Java都能開發Web應用,這些語言也都有相應成熟的Web框架,但是請求處理是這些Web框架的核心。 知乎問答-如何學習Web框架 提到Web框架涉及的基本元素,請求處理是學習Web框架的首要問題。
Flask框架
Flask 是一個用于 Python 的微型網絡開發框架。
Flask的‘微’體現在它只提供Web服務的基本功能,其他的功能是由Flask的擴展實現,用戶可以根據需求應用核心擴展。它的基本功能依賴于符合 WSGI 規范(Web Server Gateway Interface)的 Werkzeug 庫和模板系統 Jinja2 。
當我們通過URL訪問網站時,是向Web服務器發送了請求。服務器會根據URL將請求交給相應的Web程序處理。所以服務器與Web應用程序的交互需要一定的規則。而Python專用的規范是WSGI [PEP-3333 定義],文章WSGI簡介 給出了簡單說明。
Flask核心功能
Flask涉及到兩個重要的類——Flask和Blueprint[藍本] 類。
flask的應用程序需要Flask類實例化才能運行,網站的基本配置信息也包含在此類中。
實例化如下:
from flask import Flask app = Flask(__name__)#__name__程序的文件名,通過此變量定位資源文件位置
配置如下:
app.config['CONFIGURATION'] = "CONFIGURATION"
Blueprint類與Flask類似,它能夠更好的組織Web應用程序,并能延遲Flask類實例的創建。
1. 路由和請求處理
路由 的存在是為了將Web服務的請求轉交給Flask程序實例的函數處理,簡單的說處理URL和函數之間的關系稱為路由。函數稱為 視圖函數 。
Flask類 包含了route裝飾器,通過初始化Flask類注冊視圖函數。
無參數
@app.route('/') def index(): return "<h1>Hellow World</h1>"
當訪問網站根域名時,會執行index函數,返回值的結果會在網頁中顯示。。
帶參數
在很多時候用戶不同,使用的URL不同,帶參數的路由能夠很好的處理URL中變化的部分。如在網頁中顯示個人名字
@app.route('/user/<name>') def user(name): return '<h1>Hello, {!r}</h1>'.format(name)
<name> 部分是可變部分,name將作為參數傳遞給視圖函數。此部分可以指定name 的類型,如 @app.route('/user/<int:age>') 可指定參數類型
可指定的類型有int,float,path(路徑標識)
</div>
處理GET, POST請求
@app.route('/', methods=['GET', 'POST']) def index(): pass
當網頁需要處理表單等請求時,需要添加methods,使得視圖函數能夠處理http請求。methods中的參數包括了Http協議中定義的5種動作。
響應處理
from flask import make_request @app.route('/'): response = make_request("<h1>Cookie</h1>") response.set_cookie('answer','42') return response
響應處理中很重要的一部分是處理Http協議的狀態碼。Flask默認狀態碼是200。而返回特殊狀態碼可在返回值中添加,代碼如下:
@app.route('/') def index(): return "<h1>Bad Request</h1>", 400 #返回特殊狀態碼
“'?' + 鍵值對“ 形式
? 后的鍵值對由flask提供request對象處理。假設URL為 127.0.0.1:5000?page=1
from flask import request@app.route('/', methods=['GET']) def index(): page = request.args.get('page', type=int)</pre>
2. 異常處理
在瀏覽網頁時,可能會遇到一些錯誤,flask提供abort函數拋出錯誤,而拋出的異常會直接返回給Web服務器。我們也可以自定義處理這些異常。代碼如下:
from flask import abort @app.route('/') def index(): abort(404) #拋出404異常@app.errorhandler(404) def page_not_found(error): # 自定義處理異常 return 'This page does not exist', 404</pre>
3. 請求鉤子
請求鉤子 是指在請求之前或之后所做的處理函數
函數名 | 功能 |
---|---|
before_first_request | 在處理第一個請求之前執行 |
before_request | 每次請求之前執行 |
after_request | 無異常,每次請求之后執行 |
teardown_request | 即使異常,也在請求之后執行 |
請求鉤子函數與視圖函數之間通過g變量共享數據。
問題
Q1:如何調試Web應用程序?
Q2:如何評價Web應用程序的性能?
Q3:Web應用程序如何做單元測試?
學習資料
-
《Flask Web 開發》SegmentFault系列文章 - 作者只錄入了前七章內容,未涉及實例開發部分
-
《Flask Web 開發》中文版 - 建議入手第二版
-
《Flask Web 開發》作者Blog - 書中有任何疑問可以在文章中搜索
</ol> </div>