Flask程序運行過程:
所有Flask程序必須有一個程序實例。
Flask調用視圖函數後,會將視圖函數的返回值作爲響應的內容,返回給客戶端。一般情況下,響應內容主要是字符串和狀態碼。
當客戶端想要獲取資源時,一般會通過瀏覽器發起HTTP請求。此時,Web服務器使用WSGI(Web Server Gateway Interface)協議,把來自客戶端的所有請求都交給Flask程序實例。WSGI是爲 Python 語言定義的Web服務器和Web應用程序之間的一種簡單而通用的接口,它封裝了接受HTTP請求、解析HTTP請求、發送HTTP,響應等等的這些底層的代碼和操作,使開發者可以高效的編寫Web應用。
程序實例使用Werkzeug來做路由分發(URL請求和視圖函數之間的對應關係)。根據每個URL請求,找到具體的視圖函數。 在Flask程序中,路由的實現一般是通過程序實例的route裝飾器實現。route裝飾器內部會調用add_url_route()方法實現路由註冊。
調用視圖函數,獲取響應數據後,把數據傳入HTML模板文件中,模板引擎負責渲染響應數據,然後由Flask返回響應數據給瀏覽器,最後瀏覽器處理返回的結果顯示給客戶端。
示例:
新建文件hello.py:
# 導入Flask類
from flask import Flask
#Flask類接收一個參數__name__
app = Flask(__name__)
# 裝飾器的作用是將路由映射到視圖函數index
@app.route('/')
def index():
return 'Hello World'
# Flask應用程序實例的run方法啓動WEB服務器
if __name__ == '__main__':
app.run()
查看視圖函數中的路由:
給路由傳參示例:
有時我們需要將同一類URL映射到同一個視圖函數處理,比如:使用同一個視圖函數 來顯示不同用戶的個人信息。
# 路由傳遞的參數默認當做string處理,這裏指定int,尖括號中冒號後面的內容是動態的
@app.route('/user/<int:id>')
def hello_itcast(id):
return 'hello itcast %d' %id
返回狀態碼示例:
return後面可以自主定義狀態碼(即使這個狀態碼不存在)。當客戶端的請求已經處理完成,由視圖函數決定返回給客戶端一個狀態碼,告知客戶端這次請求的處理結果。
@app.route('/')
def hello_itcast():
return 'hello itcast',999
abort函數:
如果在視圖函數執行過程中,出現了異常錯誤,我們可以使用abort函數立即終止視圖函數的執行。通過abort函數,可以向前端返回一個http標準中存在的錯誤狀態碼,表示出現的錯誤信息。
使用abort拋出一個http標準中不存在的自定義的狀態碼,沒有實際意義。如果abort函數被觸發,其後面的語句將不會執行。其類似於python中raise。
from flask import Flask,abort
@app.route('/')
def hello_itcast():
abort(404)
return 'hello itcast',999
捕獲異常:
在Flask中通過裝飾器來實現捕獲異常,errorhandler()接收的參數爲異常狀態碼。視圖函數的參數,返回的是錯誤信息。
@app.errorhandler(404)
def error(e):
return '您請求的頁面不存在了,請確認後再次訪問!%s'%e
重定向redirect示例
from flask import redirect
@app.route('/')
def hello_itcast():
return redirect('http://www.itcast.cn')
正則URL示例:
正則URL是爲了匹配指定的URL,而匹配指定的URL則可以達到限制訪問,以及優化訪問路徑的目的。
from flask import Flask
from werkzeug.routing import BaseConverter
class Regex_url(BaseConverter):
def __init__(self,url_map,*args):
super(Regex_url,self).__init__(url_map)
self.regex = args[0]
app = Flask(__name__)
app.url_map.converters['re'] = Regex_url
@app.route('/user/<re("[a-z]{3}"):id>')
def hello_itcast(id):
return 'hello %s' %id
設置cookie和獲取cookie
from flask import Flask,make_response
@app.route('/cookie')
def set_cookie():
resp = make_response('this is to set cookie')
resp.set_cookie('username', 'itcast')
return resp
from flask import Flask,request
#獲取cookie
@app.route('/request')
def resp_cookie():
resp = request.cookies.get('username')
return resp