三十一、python學習之Flask框架(三)檢視:路由、上下文、Flask-Script擴充套件
一、裝飾器路由的具體實現
1.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()
啟動方法: