最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Flask上下文管理機(jī)制實例解析

 更新時間:2020年03月16日 13:48:22   作者:GuoXY  
這篇文章主要介紹了Python Flask上下文管理機(jī)制實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

前言

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

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

如在計算機(jī)中,相對于進(jìn)程而言,上下文就是進(jìn)程執(zhí)行時的環(huán)境。具體來說就是各個變量和數(shù)據(jù),包括所有的寄存器變量、進(jìn)程打開的文件、內(nèi)存信息等??梢岳斫馍舷挛氖黔h(huán)境的一個快照,是一個用來保存狀態(tài)的對象。在程序中我們所寫的函數(shù)大都不是單獨完整的,在使用一個函數(shù)完成自身功能的時候,很可能需要同其他的部分進(jìn)行交互,需要其他外部環(huán)境變量的支持,上下文就是給外部環(huán)境的變量賦值,使函數(shù)能正確運行。

請求上下文

關(guān)于WSGI

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

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

  • RequestContext 請求上下文
  • Request 請求的對象,封裝了Http請求(environ)的內(nèi)容
  • Session 根據(jù)請求中的cookie,重新載入該訪問者相關(guān)的會話信息。
  • AppContext 程序上下文
  • g 處理請求時用作臨時存儲的對象。每次請求都會重設(shè)這個變量
  • current_app 當(dāng)前激活程序的程序?qū)嵗?/li>

參見Flask上下文官方文檔 請求上下文應(yīng)用上下文.

  1. application 指的就是當(dāng)你調(diào)用app = Flask(__name__)創(chuàng)建的這個對象app;

  2.request 指的是每次http請求發(fā)生時,WSGI server(比如gunicorn)調(diào)Flask.call()之后,在Flask對象內(nèi)部創(chuàng)建的Request對象;

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

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

生命周期

  • current_app的生命周期最長,只要當(dāng)前程序?qū)嵗€在運行,都不會失效。
  • Request和g的生命周期為一次請求期間,當(dāng)請求處理完成后,生命周期也就完結(jié)了
  • Session就是傳統(tǒng)意義上的session了。只要它還未失效(用戶未關(guān)閉瀏覽器、沒有超過設(shè)定的失效時間),那么不同的請求會共用同樣的session。

Flask處理流程

local線程隔離對象

不用local對象的情況

from threading import Thread

request = '123'

class MyThread(Thread):
  def run(self):
    global request
    request = 'abc'
    print('子線程',request)  #子線程 abc

mythread = MyThread()
mythread.start()
mythread.join()

print('主線程',request)     #主線程 abc

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

from threading import Thread
from werkzeug.local import Local

locals = Local()
locals.request = '123'

class MyThread(Thread):
  def run(self):
    locals.request = 'abc'
    print('子線程',locals.request)  #子線程 abc

mythread = MyThread()
mythread.start()
mythread.join()

print('主線程',locals.request)     #主線程 123

app上下文和request上下文

應(yīng)用上下文和請求上下文都是存放在一個‘LocalStack'的棧中,和應(yīng)用app相關(guān)的操作就必須要用到應(yīng)用上下文,比如通過current_app獲取當(dāng)前的這個app的名字。和請求相關(guān)的操作就必須用到請求上下文,比如使用url_for反轉(zhuǎn)視圖函數(shù)。

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

app上下文

from flask import Flask,current_app

app = Flask(__name__)

#如果在視圖函數(shù)外部訪問,則必須手動推入一個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():
  # 在視圖函數(shù)內(nèi)部可以直接訪問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_for

app = Flask(__name__)

#應(yīng)用上下文
#如果在視圖函數(shù)外部訪問,則必須手動推入一個app上下文到app上下文棧中
with app.app_context():
  print(current_app.name)   #context_demo

@app.route('/')
def index():
  # 在視圖函數(shù)內(nèi)部可以直接訪問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():
  # 手動推入一個請求上下文到請求上下文棧中
  # 如果當(dāng)前應(yīng)用上下文棧中沒有應(yīng)用上下文
  # 那么會首先推入一個應(yīng)用上下文到棧中
  print(url_for('my_list'))

if __name__ == '__main__':
  app.run(debug=True)

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

1.應(yīng)用上下文:

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

2.應(yīng)用上下文:

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

線程隔離的g對象

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python matplotlib畫圖實例之繪制擁有彩條的圖表

    Python matplotlib畫圖實例之繪制擁有彩條的圖表

    這篇文章主要介紹了Python matplotlib畫圖實例之繪制擁有彩條的圖表,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • python 實現(xiàn)一個貼吧圖片爬蟲的示例

    python 實現(xiàn)一個貼吧圖片爬蟲的示例

    下面小編就為大家?guī)硪黄猵ython 實現(xiàn)一個貼吧圖片爬蟲的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • python小練習(xí)題之條件語句if

    python小練習(xí)題之條件語句if

    這篇文章主要介紹了python小練習(xí)題之條件語句if的相關(guān)資料,文中介紹了年齡判斷、身高判斷、數(shù)字奇偶性判斷、閏年判斷、水仙花數(shù)判斷、成績等級判斷以及三角形判斷等常見場景,需要的朋友可以參考下
    2024-12-12
  • 教你掌握分布式訓(xùn)練PyTorch?DDP到Accelerate到Trainer

    教你掌握分布式訓(xùn)練PyTorch?DDP到Accelerate到Trainer

    這篇文章主要為大家介紹了教你掌握分布式訓(xùn)練PyTorch?DDP到Accelerate到Trainer
    2023-02-02
  • python中隨機(jī)函數(shù)random用法實例

    python中隨機(jī)函數(shù)random用法實例

    這篇文章主要介紹了python中隨機(jī)函數(shù)random用法,實例分析了random函數(shù)的相關(guān)使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • Python計算機(jī)視覺里的IOU計算實例

    Python計算機(jī)視覺里的IOU計算實例

    今天小編就為大家分享一篇Python計算機(jī)視覺里的IOU計算實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python發(fā)送郵件示例(支持中文郵件標(biāo)題)

    python發(fā)送郵件示例(支持中文郵件標(biāo)題)

    python發(fā)送中文郵件示例,支持中文郵件標(biāo)題和中文郵件內(nèi)容。支持多附件。根據(jù)用戶名推測郵件服務(wù)器提供商
    2014-02-02
  • Python 可視化調(diào)色盤繪制

    Python 可視化調(diào)色盤繪制

    這篇文章主要介紹了Python 可視化調(diào)色盤繪制,文章首先通過導(dǎo)入模塊并加載圖片展開全文介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-06-06
  • Python 可迭代對象 iterable的具體使用

    Python 可迭代對象 iterable的具體使用

    本文主要介紹了Python可迭代對象iterable,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 基于python讀取.mat文件并取出信息

    基于python讀取.mat文件并取出信息

    這篇文章主要介紹了基于python讀取.mat文件并取出信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12

最新評論

扎鲁特旗| 凌云县| 锡林郭勒盟| 邹城市| 姚安县| 社旗县| 故城县| 广丰县| 金塔县| 易门县| 米泉市| 高雄县| 平定县| 台中市| 亚东县| 江津市| 类乌齐县| 玉山县| 宣城市| 新干县| 镇宁| 巴青县| 柏乡县| 渭南市| 嘉定区| 辉南县| 新晃| 石门县| 巴马| 上栗县| 普兰县| 河东区| 东兰县| 昔阳县| 吉首市| 镇原县| 铁岭市| 兴文县| 安吉县| 澄江县| 仁布县|