1. 程式人生 > >三十一、python學習之Flask框架(三)檢視:路由、上下文、Flask-Script擴充套件

三十一、python學習之Flask框架(三)檢視:路由、上下文、Flask-Script擴充套件

一、裝飾器路由的具體實現

1.Flask框架路由實現

(Flask框架
Flask有兩大核心:Werkzeug和Jinja2

  • Werkzeug實現路由、除錯和Web伺服器閘道器介面
  • Jinja2實現了模板。

Werkzeug是一個遵循WSGI協議的python函式庫

  • 其內部實現了很多Web框架底層的東西,比如request和response物件;
  • 與WSGI規範的相容;支援Unicode;
  • 支援基本的會話管理和簽名Cookie;
  • 整合URL請求路由等。

2. Flask框架中實現route的方法:

Werkzeug庫的 routing 模組負責實現 URL 解析。不同的 URL 對應不同的檢視函式,routing模組會對請求資訊的URL進行解析,匹配到URL對應的檢視函式,執行該函式以此生成一個響應資訊。

routing模組內部有:

  • Rule類
    • 用來構造不同的URL模式的物件,路由URL規則
  • Map類
    • 儲存所有的URL規則和一些配置引數
  • BaseConverter的子類
    • 負責定義匹配規則
  • MapAdapter類
    • 負責協調Rule做具體的匹配的工作

二、上下文:

1.上下文:

相當於一個容器,儲存Flask程式執行過程中的一些資訊。
Flask中有兩種上下文:

  • 請求上下文;
  • 應用上下文;

2.請求上下文(request Context):

在 flask 中,可以直接在檢視函式中使用 request 這個物件進行獲取相關資料,而 request 就是請求上下文的物件,儲存了當前本次請求的相關資料,請求上下文物件有:request、session

  • request
    – 封裝了HTTP請求的內容,針對的是http請求。舉例:user = request.args.get(‘user’),獲取的是get請求的引數。
  • session
    – 用來記錄請求會話中的資訊,針對的是使用者資訊。舉例:session[‘name’] = user.id,可以記錄使用者資訊。還可以通過session.get(‘name’)獲取使用者資訊。

2.1.request獲取請求引數:

request 就是flask中代表當前請求的 request 物件,其中一個請求上下文變數(理解成全域性變數,在檢視函式中直接使用可以取到當前本次請求)。
常用的屬性如下:

屬性 說明 型別
data 記錄請求的資料,並轉換為字串 *
form 記錄請求中的表單資料 MultiDict
args 記錄請求中的查詢引數 MultiDict
cookies 記錄請求中的cookie資訊 Dict
headers 記錄請求中的報文頭 EnvironHeaders
method 記錄請求使用的HTTP方法 GET/POST
url 記錄請求的URL地址 string
files 記錄請求上傳的檔案 *

程式碼演示:

request常用的屬性:args、from、method、files、headers、url

args屬性的程式碼例項:

# GET請求:arg查詢字串,獲取請求url地址中的查詢字串引數
# 127.0.0.1:5000/args_demo?name=hahah&age=18 使用?號查詢,條件使用&分隔
@app.route("/args_demo", methods = ["POST", "GET"])
def demo_args():
    if request.method == "GET":
        name = request.args.get('name')
        age = request.args.get('age')
        print(name, age)
        return "GET response..."
    else:   
    	# 如果是post請求,接收的是表單資料
        itcast = request.form.get('itcast')
        age = request.form.get('age')
        print(itcast, age)
        return 'POST response...'

files屬性的程式碼例項:

# files屬性:
@app.route("/images", methods=['GET', 'POST'])
def get_image():
    # 獲取圖片使用post方法,通過files屬性獲取
    image = request.files.get("image")
    # 儲存圖片
    image.save("./demo01.jpg")
    return 'save image success...'

url屬性的程式碼例項

# url屬性
# 測試用例:127.0.0.1:5000/
@app.route("/", methods=["GET", "POST"])
def param_url():
    print("請求方法:" + str(request.method))
    print("請求頭:" + str(request.headers))
    print("請求url:" + str(request.url))
    return "請求url..."

3.應用上下文:

它的字面意思是 應用上下文,但它不是一直存在的,它只是request context 中的一個對 app 的代理(人),所謂local proxy。它的作用主要是幫助 request 獲取當前的應用,它是伴 request 而生,隨 request 而滅的。

應用上下文物件有:

  • current_app;
  • g變數;

3.1 current_app

應用程式上下文,用於儲存應用程式中的變數,可以通過current_app.name列印當前app的名稱,也可以在current_app中儲存一些變數,例如:

  • 應用的啟動指令碼是哪個檔案,啟動時指定了哪些引數;
  • 載入了哪些配置檔案,匯入了哪些配置;
  • 連了哪個資料庫;
  • 有哪些public的工具類、常量;
  • 專案中用來記錄專案日誌;
  • 應用跑再哪個機器上,IP多少,記憶體多大;
    current_app.name
    current_app.test_value=‘value’

3.2 g變數:

g 作為 flask 程式全域性的一個臨時變數,充當者中間媒介的作用,我們可以通過它傳遞一些資料,g 儲存的是當前請求的全域性變數,不同的請求會有不同的全域性變數,通過不同的thread id區別。
g.name=‘abc’

注意:不同的請求,會有不同的全域性變數

3.3 兩者區別:

  • 請求上下文:儲存了客戶端和伺服器互動的資料
  • 應用上下文:flask 應用程式執行過程中,儲存的一些配置資訊,比如程式名、資料庫連線、應用資訊等

上下文中的物件只能在指定上下文中使用,超出範圍不能使用 請求上下文和應用上下文原理實現:
參考文章:https://segmentfault.com/a/1190000004223296

三、Flask-Script擴充套件:

通過使用Flask-Script擴充套件,我們可以在Flask伺服器啟動的時候,通過命令列的方式傳入引數。而不僅僅通過app.run()方法中傳參,比如我們可以通過:

    python hello.py runserver -host ip地址

以上程式碼告訴伺服器在哪個網路介面監聽來自客戶端的連線。預設情況下,伺服器只監聽來自伺服器所在的計算機發起的連線,即localhost連線。

Flask-Scritp擴充套件包的作用:

  • 在終端中手動輸入host和port等;
  • 進行資料庫的遷移;
  • 自定義命令;

3.2 使用語法:

# !/usr/bin python3
# coding=utf8
from flask import Flask
from flask_script import Manager

app = Flask(__name__)
app.config['DEBUG'] = True
manage = Manager(app)

@app.route("/")
def index():
    return "hello world"

if __name__ == '__main__':
    # app.run()

    # 啟動伺服器不用開啟程式碼,可使用終端手動的啟動服務,動態的傳入host和port
    manage.run()

啟動方法:
flask_script動態啟動