Flask入門1

2020-08-12 23:42:27

這裏瞭解基本知識並建立一個簡單的網頁

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中觀察響應頭
在这里插入图片描述