欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

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

請(qǐng)求上下文

關(guān)于WSGI

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

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

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

參見(jiàn)Flask上下文官方文檔 請(qǐng)求上下文應(yīng)用上下文.

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

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

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

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

生命周期

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

Flask處理流程

local線程隔離對(duì)象

不用local對(duì)象的情況

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對(duì)象,在每個(gè)線程中都是隔離的

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

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

app上下文

from flask import Flask,current_app

app = Flask(__name__)

#如果在視圖函數(shù)外部訪問(wèn),則必須手動(dòng)推入一個(gè)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)部可以直接訪問(wèn)current_app.name
  print(current_app.name)  #context_demo
  return 'Hello World!'

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

request請(qǐng)求上下文

from flask import Flask,current_app,url_for

app = Flask(__name__)

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

@app.route('/')
def index():
  # 在視圖函數(shù)內(nèi)部可以直接訪問(wèn)current_app.name
  print(current_app.name)  #context_demo
  return 'Hello World!'

@app.route('/list/')
def my_list():
  return 'my_list'

# 請(qǐng)求上下文
with app.test_request_context():
  # 手動(dòng)推入一個(gè)請(qǐng)求上下文到請(qǐng)求上下文棧中
  # 如果當(dāng)前應(yīng)用上下文棧中沒(méi)有應(yīng)用上下文
  # 那么會(huì)首先推入一個(gè)應(yīng)用上下文到棧中
  print(url_for('my_list'))

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

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

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

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

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

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

線程隔離的g對(duì)象

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

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

相關(guān)文章

  • python 逆向爬蟲(chóng)正確調(diào)用 JAR 加密邏輯

    python 逆向爬蟲(chóng)正確調(diào)用 JAR 加密邏輯

    這篇文章主要介紹了python 逆向爬蟲(chóng)正確調(diào)用 JAR 加密邏輯,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • python實(shí)現(xiàn)批量提取指定文件夾下同類型文件

    python實(shí)現(xiàn)批量提取指定文件夾下同類型文件

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)批量提取指定文件夾下同類型文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • python pygame入門(mén)教程

    python pygame入門(mén)教程

    pygame是python的游戲編程模塊,今天我們就來(lái)一起簡(jiǎn)單的學(xué)習(xí)如何使用該模塊
    2021-06-06
  • 通過(guò)Python的jieba庫(kù)對(duì)文本進(jìn)行分詞

    通過(guò)Python的jieba庫(kù)對(duì)文本進(jìn)行分詞

    Python的jieba庫(kù)是一個(gè)中文分詞工具,它可以將一段中文文本分割成一個(gè)一個(gè)的詞語(yǔ),方便后續(xù)的自然語(yǔ)言處理任務(wù),如文本分類、情感分析等,本文給大家介紹如何通過(guò)Python的jieba庫(kù)對(duì)文本進(jìn)行分詞,文中詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-05-05
  • python實(shí)現(xiàn)web郵箱掃描的示例(附源碼)

    python實(shí)現(xiàn)web郵箱掃描的示例(附源碼)

    這篇文章主要介紹了python實(shí)現(xiàn)web郵箱掃描的示例(附源碼),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • python3 requests 各種發(fā)送方式詳解

    python3 requests 各種發(fā)送方式詳解

    這篇文章主要介紹了python3 requests 各種發(fā)送方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • python變量賦值機(jī)制踩坑記錄

    python變量賦值機(jī)制踩坑記錄

    這篇文章主要介紹了python變量賦值機(jī)制踩坑記錄,我們都知道python有深拷貝和淺拷貝,但變量賦值又是什么機(jī)制呢?這是個(gè)容易被忽略卻又極易踩坑的點(diǎn),下面我們來(lái)一探究竟,需要的朋友可以參考一下
    2022-02-02
  • PyCharm 光標(biāo)變成黑塊的解決方式

    PyCharm 光標(biāo)變成黑塊的解決方式

    這篇文章主要介紹了PyCharm 光標(biāo)變成黑塊的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Python使用jpype的踩坑記錄

    Python使用jpype的踩坑記錄

    Pype是一個(gè)能夠讓 python 代碼方便地調(diào)用 Java 代碼的工具,這篇文章主要來(lái)和大家分享一下Python使用jpype會(huì)踩的一些坑,希望對(duì)大家有所幫助
    2023-06-06
  • Python多線程批量采集圖片的代碼實(shí)現(xiàn)

    Python多線程批量采集圖片的代碼實(shí)現(xiàn)

    這篇文章主要給大家介紹了Python多線程批量采集圖片的代碼實(shí)現(xiàn),文中通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-05-05

最新評(píng)論