电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python Flask上下文管理機制實例解析

瀏覽:3日期:2022-08-02 10:13:59

前言

上下文這個概念多見于文章中,是一句話中的語境,也就是語言環境。一句莫名其妙的話出現會讓人不理解什么意思,如果有語言環境的說明,則會更好,這就是語境對語意的影響。

上下文是一種屬性的有序序列,為駐留在環境內的對象定義環境。在對象的激活過程中創建上下文,對象被配置為要求某些自動服務,如同步、事務、實時激活、安全性等等。

如在計算機中,相對于進程而言,上下文就是進程執行時的環境。具體來說就是各個變量和數據,包括所有的寄存器變量、進程打開的文件、內存信息等。可以理解上下文是環境的一個快照,是一個用來保存狀態的對象。在程序中我們所寫的函數大都不是單獨完整的,在使用一個函數完成自身功能的時候,很可能需要同其他的部分進行交互,需要其他外部環境變量的支持,上下文就是給外部環境的變量賦值,使函數能正確運行。

請求上下文

關于WSGI

WSGI(全稱Web Server Gateway Interface),是為 Python 語言定義的Web服務器和Web應用程序之間的一種簡單而通用的接口,它封裝了接受HTTP請求、解析HTTP請求、發送HTTP,響應等等的這些底層的代碼和操作,使開發者可以高效的編寫Web應用。

Flask提供了兩種上下文,一種是應用上下文(Application Context),一種是請求上下文(Request Context)。

RequestContext 請求上下文 Request 請求的對象,封裝了Http請求(environ)的內容 Session 根據請求中的cookie,重新載入該訪問者相關的會話信息。 AppContext 程序上下文 g 處理請求時用作臨時存儲的對象。每次請求都會重設這個變量 current_app 當前激活程序的程序實例

參見Flask上下文官方文檔 請求上下文 和 應用上下文.

  1. application 指的就是當你調用app = Flask(__name__)創建的這個對象app;

2.request 指的是每次http請求發生時,WSGI server(比如gunicorn)調Flask.call()之后,在Flask對象內部創建的Request對象;

3.application 表示用于響應WSGI請求的應用本身,request 表示每次http請求;

4.application的生命周期大于request,一個application存活期間,可能發生多次http請求,所以,也就會有多個request

生命周期

current_app的生命周期最長,只要當前程序實例還在運行,都不會失效。 Request和g的生命周期為一次請求期間,當請求處理完成后,生命周期也就完結了 Session就是傳統意義上的session了。只要它還未失效(用戶未關閉瀏覽器、沒有超過設定的失效時間),那么不同的請求會共用同樣的session。

Flask處理流程

Python Flask上下文管理機制實例解析

local線程隔離對象

不用local對象的情況

from threading import Threadrequest = ’123’class MyThread(Thread): def run(self): global request request = ’abc’ print(’子線程’,request) #子線程 abcmythread = MyThread()mythread.start()mythread.join()print(’主線程’,request) #主線程 abc

如果用local對象,在每個線程中都是隔離的

from threading import Threadfrom werkzeug.local import Locallocals = Local()locals.request = ’123’class MyThread(Thread): def run(self): locals.request = ’abc’ print(’子線程’,locals.request) #子線程 abcmythread = MyThread()mythread.start()mythread.join()print(’主線程’,locals.request) #主線程 123

app上下文和request上下文

應用上下文和請求上下文都是存放在一個‘LocalStack’的棧中,和應用app相關的操作就必須要用到應用上下文,比如通過current_app獲取當前的這個app的名字。和請求相關的操作就必須用到請求上下文,比如使用url_for反轉視圖函數。

在視圖函數中,不用擔心上下文的問題,因為視圖函數要執行,name肯定是通過訪問url的方式執行的,name這種情況下,Flask底層就已經自動的幫我們把請求上年文和應用上下文都推入到了相應的棧中。如果想要在視圖函數外面執行相關的操作,name就必須要手動推入相關的上下文手動推入請求上下文:推入請求上下文到棧中,會首先判斷有沒有應用上下文,如果沒有那么就會先推入應用上下文到棧中,然后再推入請求上下文到棧中。

app上下文

from flask import Flask,current_appapp = Flask(__name__)#如果在視圖函數外部訪問,則必須手動推入一個app上下文到app上下文棧中#第一種方法# app_context = app.app_context()# app_context.push()# print(current_app.name)#第二種方法with app.app_context(): print(current_app.name) #context_demo@app.route(’/’)def index(): # 在視圖函數內部可以直接訪問current_app.name print(current_app.name) #context_demo return ’Hello World!’if __name__ == ’__main__’: app.run(debug=True)

request請求上下文

from flask import Flask,current_app,url_forapp = Flask(__name__)#應用上下文#如果在視圖函數外部訪問,則必須手動推入一個app上下文到app上下文棧中with app.app_context(): print(current_app.name) #context_demo@app.route(’/’)def index(): # 在視圖函數內部可以直接訪問current_app.name print(current_app.name) #context_demo return ’Hello World!’@app.route(’/list/’)def my_list(): return ’my_list’# 請求上下文with app.test_request_context(): # 手動推入一個請求上下文到請求上下文棧中 # 如果當前應用上下文棧中沒有應用上下文 # 那么會首先推入一個應用上下文到棧中 print(url_for(’my_list’))if __name__ == ’__main__’: app.run(debug=True)

為什么上下文需要放在棧中?

1.應用上下文:

Flask底層是基于werkzeug,werkzeug是可以包含多個app的,所以這時候用一個棧來保存,如果你在使用app1,那么app1應該是要在棧的頂部,如果用完了app1那么app應該從棧中刪除,方便其他代碼使用下面的app。

2.應用上下文:

如果在寫測試代碼,或者離線腳本的時候,我們有時候可能需要創建多個請求上下文,這時候就需要存放到一個棧中了。使用哪個請求上下文的時候,就把對應的請求上下文放到棧的頂部,用完了就要把這個請求上下文從棧中移除掉。

線程隔離的g對象

g對象是在整個Flask應用運行期間都是可以使用的,并且它也是跟request一樣是線程隔離的。這個對象是專門用來存儲開發者自定義的一些數據,方便在整個Flask程序中都可以使用。一般使用就是,將一些經常會用到的數據綁定到上面,以后就直接從g上面取就可以了,而不是通過傳參的形式,這樣更加方便。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 连续油炸机,全自动油炸机,花生米油炸机-烟台茂源食品机械制造有限公司 | 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | pos机办理,智能/扫码/二维码/微信支付宝pos机-北京万汇通宝商贸有限公司 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 喷砂机厂家_自动喷砂机生产_新瑞自动化喷砂除锈设备 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 金属切削液-脱水防锈油-电火花机油-抗磨液压油-深圳市雨辰宏业科技发展有限公司 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 自动螺旋上料机厂家价格-斗式提升机定制-螺杆绞龙输送机-杰凯上料机 | 塑料薄膜_PP薄膜_聚乙烯薄膜-常州市鑫美新材料包装厂 | 北京征地律师,征地拆迁律师,专业拆迁律师,北京拆迁律师,征地纠纷律师,征地诉讼律师,征地拆迁补偿,拆迁律师 - 北京凯诺律师事务所 | 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 深圳公司注册-工商注册公司-千百顺代理记账公司 | 手机游戏_热门软件app下载_好玩的安卓游戏下载基地-吾爱下载站 | 珠宝展柜-玻璃精品展柜-首饰珠宝展示柜定制-鸿钛展柜厂家 | 北京包装设计_标志设计公司_包装设计公司-北京思逸品牌设计 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 砂磨机_立式纳米砂磨机_实验室砂磨机-广州儒佳化工设备厂家 | 隐形纱窗|防护纱窗|金刚网防盗纱窗|韦柏纱窗|上海青木装潢制品有限公司|纱窗国标起草单位 | 庭院灯_太阳能景观灯_草坪灯厂家_仿古壁灯-重庆恒投科技 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 辊道窑炉,辊道窑炉厂家-山东艾希尔 | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 首页-瓜尔胶系列-化工单体系列-油田压裂助剂-瓜尔胶厂家-山东广浦生物科技有限公司 | 分光色差仪,测色仪,反透射灯箱,爱色丽分光光度仪,美能达色差仪维修_苏州欣美和仪器有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 镀锌方管,无缝方管,伸缩套管,方矩管_山东重鑫致胜金属制品有限公司 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 |