簡介:python
- 在大多數標準彙總,Flask都算是小型框架,甚至能夠成爲「微框架」。同時具有高擴展的能力,具備一個包含基本服務的強健核心,其餘功能可經過擴展實現。
- 兩個主要依賴:路由、調試和Web服務器網關接口子系統有Werkzeug提供;模板系統由Jinja2提供。
先將實驗文件從git的倉庫中下載到本地,而且切換到1a分支:git
$ git clone https://github.com/miguelgrinberg/flasky.git $ cd flasky $ git checkout 1a
查看是否安裝了virtualenv(虛擬環境使用第三方實用工具):github
virtualenv --version
結果顯示錯誤,則表示沒安裝,安裝命令:flask
pip install virtualenv
使用virtualenv命令在flasky文件夾中建立Python虛擬環境:服務器
virtualenv venv
virtualenv命令中只要一個必須參數,venv便是虛擬環境的名字。而且會建立一個子文件夾,全部與虛擬環境相關的文件都會保存在這個文件夾中。cookie
source vev/bin/activate
退出當前虛擬環境,回到全局Python解釋器中:網絡
deactivate
進入flasky文件,激活虛擬環境,使用pip命令安裝Flask:session
$ cd flasky $ source venv/bin/activate $ pip install flask
全部Flask程序都必須建立一個程序實例。Web服務器使用一種WSGI的協議,把接收自客戶端的全部請求都交由這個對象處理。程序實例是Flask類的對象。app
from flask import Flask app = Flask(__name__)
客戶端把請求發送給Web服務器,Web服務器將請求發送給Flask程序實例。程序實例須要只要知道每一個URL請求運行那些代碼,即URL到Python函數的映射關係。
處理URL和Python函數之間的關係的程序成爲路由
視圖函數返回的響應能夠包括HTML的簡單字符串,也能夠是複雜的表單。框架
程序實例用run方法啓動Flask集成的開發Web服務器:
if __name__ == 「__main__」: app.run(debug=True)
將前幾節介紹的Flask Web程序的不一樣組成部分合併到一個hello.py文件
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>Hello World!</h1>' if __name__ == "__main__": app.run(debug=True)
切換到虛擬環境,執行hello.py文件,啓動Flask程序:
$: curl 127.0.0.1:5000
優化成包含動態路由的Flask程序
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>Hello World!</h1>' if __name__ == "__main__": app.run(debug=True)
測試效果
Flask從客戶端接收到的請求,要讓視圖函數訪問請求對象,一種顯而易見的方式就是將其做爲參數傳入視圖函數,不過致使程序中的每一個視圖函數都會增長一個參數。
爲了不大量無關緊要的參數把視圖函數弄的一團糟,Flask使用了上下文臨時把某些對象變爲全局可訪問。在Flask中有兩種上下文:程序上下文和請求上下文
- 變量名 上下文 說明
- current_app 程序上下文 當前激活程序的實例
- g 程序上下文 處理請求時用做臨時存儲的對象,每次請求都會重設這個變量
- request 請求上下文 請求對象,封裝了客戶端發出的HTTP請求中的內容
- session 請求上下文 用戶會話,用於存儲請求之間須要「記住」的值的詞典。
程序收到客戶端發送的請求,要找處處理該請求的視圖函數。
Flask會在程序的URL映射中查找請求的URL。URL映射是URL和視圖函數之間的對應關係。
Flask使用app.route修飾器或者非修飾器形式的app.add_url_rule()生成映射。
>> >> from hello import app >> app.url_map Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>, <Rule '/user/<name>' (HEAD, OPTIONS, GET) -> user>])
URL映射中的HEAD、Options、GET是請求方法,由路由進行處理。
有時候在處理請求以前或以後執行代碼會頗有用。請求鉤子使用修飾器實現,Flask支持如下4種鉤子:
- before_firest_request: 註冊一個函數,在處理第一個請求以前運行
- before_request: 註冊一個函數,在每次請求執勤啊運行
- after_request: 註冊一個函數,若是沒有未處理的異常拋出,在每次請求以後運行。
- teardown_request: 註冊一個函數,即便有未處理的異常拋出,也在每次請求以後運行。
在大多數狀況下,響應就是一個簡單的字符串,做爲HTML頁面傳回客戶端。但HTTP協議須要的不只是做爲請求響應的字符串。
其中HTTP響應中一個很重要的部分是狀態碼,Flask默認爲200.
make_response()函數可接受1個、2個或3個參數,並返回一個Response對象。
from flask import make_response @app_route(‘/’) def index(): response = make_response(‘<h1>This document carries a cookie!</h1>’) response.set_cookie(‘answer’,’42’) return response
from flask import redirect @app.route(‘/’) def index(): return redirect(「http://www.example.com」)
還有一種特殊的響應有abort函數生成,用於處理錯誤。
使用Flask-Script支持命令行選項
Flask-Script是一個Flask擴展,爲Flask程序添加一個命令行解析器。Flask-Script自帶了一組經常使用選項,並且還支持自定義命令。
pip install flask-script
from flask import Flask from flask_script import Manager app = Flask( __name__ ) manager = Manager( app ) @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__」: manager.run()
若是已經從git上克隆了該倉庫,能夠直接切換到2c分支上。
這樣修改以後,程序可使用一組基本命令行選項,如今運行hello.py
- --host參數告訴Web服務器在哪一個網絡接口上監聽來自客戶端的鏈接。
- --port參數告訴Web服務器在哪一個網絡端口。
python hello.py runserver --host 0.0.0.0 --port 9999