【Flask】flask上下文
上下文:即語(yǔ)境,語(yǔ)意,在程序中可以理解為在代碼執(zhí)行到某一時(shí)刻時(shí),根據(jù)之前代碼所做的操作以及下文即將要執(zhí)行的邏輯,可以決定在當(dāng)前時(shí)刻下可以使用到的變量,或者可以完成的事情。
Flask中有兩種上下文,請(qǐng)求上下文和應(yīng)用上下文
Flask中上下文對(duì)象:相當(dāng)于一個(gè)容器,保存了 Flask 程序運(yùn)行過(guò)程中的一些信息。
一、請(qǐng)求上下文
思考:在視圖函數(shù)中,如何取到當(dāng)前請(qǐng)求的相關(guān)數(shù)據(jù)?比如:請(qǐng)求地址,請(qǐng)求方式,cookie等等
在 flask 中,可以直接在視圖函數(shù)中使用 request 這個(gè)對(duì)象進(jìn)行獲取相關(guān)數(shù)據(jù),而 request 就是請(qǐng)求上下文的對(duì)象,保存了當(dāng)前本次請(qǐng)求的相關(guān)數(shù)據(jù),請(qǐng)求上下文對(duì)象有:request、session
- request
封裝了HTTP請(qǐng)求的內(nèi)容,針對(duì)的是http請(qǐng)求。舉例:user = request.args.get(‘user’),獲取的是get請(qǐng)求的參數(shù)。 - session
用來(lái)記錄請(qǐng)求會(huì)話中的信息,針對(duì)的是用戶信息。舉例:session[‘name’] = user.id,可以記錄用戶信息。還可以通過(guò)session.get(‘name’)獲取用戶信息。
二、應(yīng)用上下文
它的字面意思是 應(yīng)用上下文,但它不是一直存在的,它只是request context 中的一個(gè)對(duì) app 的代理(人),所謂local proxy。它的作用主要是幫助 request 獲取當(dāng)前的應(yīng)用,它是伴 request 而生,隨 request 而滅的。
應(yīng)用上下文對(duì)象有:current_app,g
current_app
應(yīng)用程序上下文,用于存儲(chǔ)應(yīng)用程序中的變量,可以通過(guò)current_app.name打印當(dāng)前app的名稱(chēng),也可以在current_app中存儲(chǔ)一些變量,例如:
- 應(yīng)用的啟動(dòng)腳本是哪個(gè)文件,啟動(dòng)時(shí)指定了哪些參數(shù)
- 加載了哪些配置文件,導(dǎo)入了哪些配置
- 連了哪個(gè)數(shù)據(jù)庫(kù)
- 有哪些public的工具類(lèi)、常量
- 應(yīng)用跑在哪個(gè)機(jī)器上,IP多少,內(nèi)存多大
代碼塊:
在app.py文件設(shè)置一個(gè)任意參數(shù),去藍(lán)圖中去拿這個(gè)定義的參數(shù)
from flask import Flask from item藍(lán)圖 import item_bp app = Flask(__name__)app.zilv='hello zilv' #往app中設(shè)置任意的一個(gè)參數(shù)app.register_blueprint(item_bp,url_prefix='/item')@app.route('/') def hello_world():return 'hello world'if __name__ == '__main__':app.run(debug=True)代碼塊
在藍(lán)圖文件中,通過(guò)current_app.參數(shù)名,去獲得這個(gè)參數(shù)值
from flask import Flask,Blueprint,current_appfrom db_handler import find_items#創(chuàng)建藍(lán)圖 item_bp=Blueprint('item',__name__)#藍(lán)圖中創(chuàng)建視圖函數(shù) @item_bp.route('/get') def hello_item():print(current_app.zilv)return "產(chǎn)品模塊的頁(yè)面"特別注意:current_app是app的代理對(duì)象,在藍(lán)圖中,任何地方不方便取app文件中參數(shù)的情況下,都可以用current_app來(lái)獲得
三、G對(duì)象
g 作為 flask 程序全局的一個(gè)臨時(shí)變量,充當(dāng)中間媒介的作用,我們可以通過(guò)它在一次請(qǐng)求調(diào)用的多個(gè)函數(shù)間傳遞一些數(shù)據(jù)。每次請(qǐng)求都會(huì)重設(shè)這個(gè)變量。
案例:
在視圖中,通過(guò)g對(duì)象獲得了從客戶端傳來(lái)的數(shù)據(jù),
from flask import Flask,Blueprint,current_app,gfrom db_handler import find_items#創(chuàng)建藍(lán)圖 item_bp=Blueprint('item',__name__)#藍(lán)圖中創(chuàng)建視圖函數(shù) @item_bp.route('/get') def hello_item():print(current_app.zilv)#從請(qǐng)求參數(shù)中獲得g.item_id='666'g.item_name='qqq'find_items()return "產(chǎn)品模塊的頁(yè)面"在另外一個(gè)應(yīng)用文件中想獲得從客戶端傳來(lái)的數(shù)據(jù),也通過(guò)g對(duì)象
例如
運(yùn)行結(jié)果:
hello zilv 從數(shù)據(jù)庫(kù)中查詢(xún)數(shù)據(jù),通過(guò)多個(gè)不確定的條件 666 qqq而如果不用g對(duì)象的話 舉例:
藍(lán)圖視圖模塊
from register import register_bp from flask import Flask,render_template,current_app from register.handle_db import handle@register_bp.route('/view') def register_view():print(current_app.kobe)user_id='666'handle()return 'ok'獲得視圖中的數(shù)據(jù)模塊
from flask import Flaskdef handle():print(user_id)執(zhí)行項(xiàng)目后:NameError: name ‘user_id’ is not defined
所以:g 作為 flask 程序全局的一個(gè)臨時(shí)變量,充當(dāng)中間媒介的作用,我們可以通過(guò)它在一次請(qǐng)求調(diào)用的多個(gè)函數(shù)間傳遞一些數(shù)據(jù)。每次請(qǐng)求都會(huì)重設(shè)這個(gè)變量。
總結(jié)
以上是生活随笔為你收集整理的【Flask】flask上下文的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于解决mybase7继续使用的方法
- 下一篇: 【Flask】ORM的关联关系