1.Flask基本知識點
瞭解Flask
Flask框架的特點
常用的Flask擴充套件包
安裝環境
設定虛擬環境
安裝Flask
從Hello World開始
給路由傳遞參數
返回狀態碼
重定向
正則URL
捕獲異常
設定cookie和獲取cookie
擴充套件
上下文
請求勾點
Flask裝飾器路由的實現
Flask-Script命令列
正式瞭解Flask框架
1)Flask作爲Web框架,它的作用主要是爲了開發Web應用程式。
2)所有Flask程式都必須建立一個程式範例。
3)當用戶端想要獲取資源時,一般會通過瀏覽器發起HTTP請求。
4)此時,Web伺服器使用一種名爲WEB伺服器閘道器介面的WSGI(Web Server Gateway Interface)協定,把來自用戶端的請求都交給Flask程式範例。
5)Flask使用Werkzeug來做路由分發(URL請求和檢視函數之間的對應關係)。根據每個URL請求,找到具體的檢視函數。
6)在Flask程式中,路由一般是通過程式範例的裝飾器實現。通過呼叫檢視函數,獲取到數據後,把數據傳入HTML模板檔案中,模板引擎負責渲染HTTP響應數據,然後由Flask返迴響應數據給瀏覽器,最後瀏覽器顯示返回的結果。
使用web框架可以避免重複造輪子,把精力放在具體的業務邏輯上面。使用Web框架開發Web應用程式可以降低開發難度,提高開發效率。
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返迴響應數據給瀏覽器,最後瀏覽器處理返回的結果顯示給用戶端。
Flask拓展包:
Flask-SQLalchemy:操作數據庫;
Flask-migrate:管理遷移數據庫;
Flask-Mail:郵件;
Flask-WTF:表單;
Flask-script:插入指令碼;
Flask-Login:認證使用者狀態;
Flask-RESTful:開發REST API的工具;
Flask-Bootstrap:整合前端Twitter Bootstrap框架;
Flask-Moment:在地化日期和時間;
Flask類似一個積木由各種拓展包拼搭起來,並不像Django那麼功能整合。
2.安裝環境,這裏我們用python2的環境
虛擬環境使用virtualenv建立,可以檢視系統是否安裝了virtualenv:並不是一定要安裝。但virtualenv可以保證程式只能存取虛擬環境中的包。而不會影響系統中安裝的全域性Python直譯器,從而保證全域性直譯器的整潔。如果有興趣但沒有安裝的可以參考以下文章:
virtualenv的安裝和簡單用法
2.1安裝Flask
爲了防止版本錯誤指定Flask版本安裝
pip install flask==0.10.1
3.Hello world網頁
範例:
#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()
然後執行:
python hello.py
此時我們可以在本機的瀏覽器上存取127.0.0.1:5000就可以看到hello world網頁了
//記得在執行時注意執行路徑
這裏顯示的路徑是什麼瀏覽器裡就填什麼路徑
但此時我們可以檢視一下檢視函數中的路由:
進入ipython後如圖執行可得:
由圖可知此時有兩個路由分別是index和靜態檔案路由
給路由傳參範例:
有時我們需要將同一類URL對映到同一個檢視函數處理,比如:使用同一個檢視函數 來顯示不同使用者的個人資訊。
在hello.py中進入下面 下麪程式碼
# 路由傳遞的參數預設當做string處理,這裏指定int,尖括號中冒號後面的內容是動態的
@app.route('/user/<int:id>')
def hello_itcast(id):
return 'hello itcast %d' %id
然後重新開啓並存取,以此路徑爲例127.0.0.1:5000/user/2017
可以看到如下:
返回狀態碼範例:
return後面可以自主定義狀態碼(即使這個狀態碼不存在)。當用戶端的請求已經處理完成,由檢視函數決定返回給用戶端一個狀態碼,告知用戶端這次請求的處理結果。
在hello.py中進入下面 下麪程式碼
@app.route('/')
def hello_itcast():
return 'hello itcast',999
abort函數:
如果在檢視函數執行過程中,出現了異常錯誤,我們可以使用abort函數立即終止檢視函數的執行。通過abort函數,可以向前端返回一個http標準中存在的錯誤狀態碼,表示出現的錯誤資訊。
使用abort拋出一個http標準中不存在的自定義的狀態碼,沒有實際意義。如果abort函數被觸發,其後面的語句將不會執行。其類似於python中raise。
在hello.py中進入下面 下麪程式碼
from flask import Flask,abort
@app.route('/')
def hello_itcast():
abort(404)
return 'hello itcast',110
捕獲異常:
在Flask中通過裝飾器來實現捕獲異常,errorhandler()接收的參數爲異常狀態碼。檢視函數的參數,返回的是錯誤資訊。
在hello.py中進入下面 下麪程式碼
@app.errorhandler(404)
def error(e):
return '您請求的頁面不存在了,請確認後再次存取!%s'%e
重新啓動時存取一個不存在路徑
看到:
重定向redirect範例
在hello.py中進入下面 下麪程式碼
from flask import redirect
@app.route('/')
def hello_itcast():
return redirect('http://www.baidu.com')
重新執行後,存取127.0.0.1:5000/可以看到我們成功來到百度首頁
正則URL範例:
正則URL是爲了匹配指定的URL,而匹配指定的URL則可以達到限制存取,以及優化存取路徑的目的。
#Regex.py
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
啓動Regex.py,寫正確的路徑存取
設定cookie和獲取cookie
在Regex.py中加入
from flask import Flask,make_response
@app.route('/cookie')
def set_cookie():
resp = make_response('set cookie')
resp.set_cookie('username', 'Flask')
return resp
啓動程式後,正確存取網頁並按F12在Network中觀察響應頭