flask中的上下文


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))

@app.route('/')
def get_user_profile():
   g.user_id = 131
   g.user_name = 'Jeremy'
   db_query()
   return 'hello world'
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)
...  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM