Flask上下文
1上下文概念與Flask上下文對象分類
# Flask上下文
上下文:即語境,語意,在程序中可以理解為在代碼執行到某一時刻時,根據之前代碼所做的操作以及下文即將要執行的邏輯,可以決定在當前時刻下可以使用到的變量,或者可以完成的事情
Flask上下文對象分類:
(1).請求上下文:
1).request
2).session
(2).應用上下文:
1).current_app
2).g對象
2請求上下文之request與session
# 請求上下文: request與session
# request對象:
封裝了HTTP請求的內容, 針對的是HTTP請求. 請求的數據封裝在request對象中, 比如查詢參數, 文件數據等
# session:
session用來記錄請求會話中的信息, 針對的是用戶信息.
3應用上下文current_app與g對象
2.應用上下文: current_app與g對象
# current_app對象:
current_app事實上是Flask實例的代理, 由於一個項目只能有一個app實例, 在其他地方使用app需要導入, 不方便使用, current_app就是APP的全局代理. 在代碼不方便操作flask的APP對象時, 可以操作current_app就等價於操作APP實例.
current_app用於存儲應用程序中的變量:
- 應用的啟動腳本是哪個文件, 啟動時指定了哪些參數
- 加載了哪些配置文件, 導入了哪些配置
- 連接了哪個數據庫
- 有哪些public的工具類, 常量
- 應用跑在哪個機器上, IP是多少,內存多大等等信息
# g對象
g對象作為flask程序全局的一個臨時變量, 充當中間媒介的作用, 我們可以通過它在一次請求調用的多個函數間傳遞一些數據, 相當與一個共享的數據容器, 每次請求都會重設這個變量.
# g對象實例
from flask import Flask, g
app = Flask(__name__)
def db_query():
user_id = g.user_id
user_name = g.user_name
print('user_id={} user_name={}'.format(user_id, user_name))
4手動開啟上下文
# 手動開啟上下文
在flask程序未運行的情況下, 調試代碼或進行測試, 同樣需要使用current_app, g, request這些對象, 但程序未運行, 所以無法使用, 此時需要手動開啟上下文.
# app_context
app_context為我們提供了應用上下文環境, 允許我們在外部使用應用上下文current_app, g. 可以通過with語句進行使用:
>>> from flask import Flask
>>> app = Flask('')
>>> app.redis_cli = 'redis client'
>>>
>>> from flask import current_app
>>> current_app.redis_cli # 錯誤,沒有上下文環境
報錯
>>> with app.app_context(): # 借助with語句使用app_context創建應用上下文
... print(current_app.redis_cli)
...
redis client
# request_context
request_context為我們提供了請求上下文環境,允許我們在外部使用請求上下文request、session可以通過with語句進行使用
>>> from flask import Flask
>>> app = Flask('')
>>> request.args # 錯誤,沒有上下文環境
報錯
>>> environ = {'wsgi.version':(1,0), 'wsgi.input': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/', 'SERVER_NAME': 'itcast server', 'wsgi.url_scheme': 'http', 'SERVER_PORT': '80'} # 模擬解析客戶端請求之后的wsgi字典數據
>>> with app.request_context(environ): # 借助with語句使用request_context創建請求上下文
... print(request.path)
...
