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