全部Flask程序都必須建立一個程序實例。web服務器使用一種名爲Web服務器網關藉口的協議,把接收自客戶端的全部請求都轉交給這個對象處理。python
from flask import Flask app = Flask(__name__)
Flask類的構造函數只有一個必須指定的參數,即程序主模塊或包的名字。web
客戶端把請求發送給Web服務器,Web服務器再把請求發送給Flask程序實例。程序實例須要知道對每一個URL請求運行哪些代碼,因此保存了一個URL到Python函數的映射關係。處理URL和函數之間關係的程序稱爲路由。數據庫
@app.route('/') def index(): return '<h1>Hello Flask!</h1>'
像index()這樣的函數稱爲視圖函數。視圖函數返回的響應能夠包含HTML的簡單字符串,也能夠是複雜的表單。flask
@app.route('/user/name') def index(name): return '<h1>Hello %s!</h1>' % name
尖括號內的內容就是動態內容,任何能匹配靜態部分的URL都會映射到這個路由上。服務器
路由中的動態部分默認使用字符串,不過也可使用類型定義。例如,/usr/<int:id>只會匹配動態片斷爲整數的URL。Flask支持在路由中使用int、float和path類型。cookie
if __name__ == '__main__': app.run(debug=True)
有一些選項參數可被app.run()函數接受用於設置web服務器的操做模式。在開發過程當中啓用調試模式會帶來一些便利,好比激活調試器和重載程序。要想啓用調試模式,咱們能夠把debug參數設爲True。session
#!/usr/bin/env python from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>Hello Flask!</h1>' if __name__ == '__main__': app.run(debug=True)
包含動態路由的Flask程序多線程
#!/usr/bin/env python from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>Hello Flask!</h1>' @app.route('/user/<name>') def user(name): return '<h1>Hello,%s!</h1>' % name if __name__ == '__main__': app.run(debug=True)
http://127.0.0.1:5000/user/cairuiapp
下面介紹這個框架的一些設計理念。框架
①程序和請求上下文
爲了不大量無關緊要的參數把視圖函數弄得一團糟,Flask請求使用上下文臨時把某些對象變爲全局可訪問。
from flask import request @app.route('/') def index(): user_agent = request.headers.get('User-Agent') return '<p>Your browser is %s</p>' % user_agent
Flask使用上下文讓特定的變量在一個線程中全局可訪問,與此同時卻不會干擾其餘線程。
線程是可單獨管理的最小指令集。進程常常使用多個活動線程,有時還會共享內存或文件句柄等資源。多線程web服務器會建立一個線程池,再從線程池中選擇一個線程用於處理接收到的請求。
(表)Flask上下文全局變量
變量名 | 上下文 | 說 明 |
current_app | 程序上下文 | 當前激活程序的程序實例 |
g | 程序上下文 | 當前請求時用做臨時存儲對象。每次請求都會重設這個變量 |
request | 請求上下文 | 請求對象,封裝了客戶端發出的HTTP請求中的內容 |
session | 請求上下文 | 用戶會話,用於存儲請求之間須要「記住」的值得詞典 |
Flask在分發請求以前激活(或推送)程序和請求上下文,請求處理完成後再將其刪除。
from hello import app from flask import current_app current_app.name ========================================= Traceback (most recent call last)
from hello import app from flask import current_app app_ctx = app.app_context() app_ctx.push() current_app.name
②請求調度
from hello import app app.url_map
③請求鉤子
有時在處理請求以前或以後執行代碼會頗有用。例如,在請求開始時,咱們可能須要建立數據庫鏈接或者認證發起請求的用戶。爲了不在每一個視圖函數中都使用重複的代碼,Flask提供了註冊通用函數的功能,註冊函數可在請求被分發到視圖函數以前或以後調用。
Flask支持如下4種鉤子:
④響應
@app.route('/') def index(): return '<h1>Bad Request</h1>', 400
from flask import make_response @app.route('/') def index(): response = make_response('<h1>This carries a cookie!</h1>') response.set_cookie('answer','42') return response
使用Flask-Script支持命令行選項
#!/usr/bin/env python from flask_script import Manager from flask import Flask app = Flask(__name__) manager = Manager(app) @app.route('/') def index(): return '<h1>Hello Flask!</h1>' @app.route('/user/<name>') def user(name): return '<h1>Hello,%s!</h1>' % name if __name__ == '__main__': manager.run()