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

Flask請求鉤子與上下文及異常處理分項精解

 更新時間:2022年10月13日 10:00:11   作者:Ywx_csdn  
這篇文章主要介紹了Flask請求鉤子與上下文及異常處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧

一、請求鉤子學(xué)習(xí)

介紹

1.為了讓每個視圖函數(shù)避免編寫重復(fù)功能的代碼,F(xiàn)lask提供了通用設(shè)施的功能,即請求鉤子。

2.請求鉤子是通過裝飾器的形式實現(xiàn),F(xiàn)lask支持如下四種請求鉤子:

請求鉤子是通過裝飾器的形式實現(xiàn),F(xiàn)lask支持如下四種請求鉤子:

1.before_first_request

- 在處理第一個請求前執(zhí)行

2.before_request

- 在每次請求前執(zhí)行

- 如果在某修飾的函數(shù)中返回了一個響應(yīng),視圖函數(shù)將不再被調(diào)用

3.after_request

- 如果沒有拋出錯誤,在每次請求后執(zhí)行

- 接受一個參數(shù):視圖函數(shù)作出的響應(yīng)

- 在此函數(shù)中可以對響應(yīng)值在返回之前做最后一步修改處理

- 需要將參數(shù)中的響應(yīng)在此參數(shù)中進行返回

4.teardown_request:

- 在每次請求后執(zhí)行

- 接受一個參數(shù):錯誤信息,如果有相關(guān)錯誤拋出

代碼示例:

from flask import *
app=Flask(__name__)
# 在第一次請求之前調(diào)用,可以在此方法內(nèi)部做一些初始化操作
@app.before_first_request
def before_first_requests():
    print('服務(wù)器第一次接受請求的時候執(zhí)行')
# 在每一次請求之前調(diào)用,這時候已經(jīng)有請求了,可能在這個方法里面做請求的校驗
# 如果請求的校驗不成功,可以直接在此方法中進行響應(yīng),直接return之后那么就不會執(zhí)行視圖函數(shù)
@app.before_request
def before_request():
    print('每次視圖函數(shù)執(zhí)行之前執(zhí)行')
    #如果有return,后面的視圖函數(shù)就不執(zhí)行了
    #return "提前結(jié)束“
    # if 請求不符合條件:
    # return "laowang"
# 在執(zhí)行完視圖函數(shù)之后會調(diào)用,并且會把視圖函數(shù)所生成的響應(yīng)傳入,可以在此方法中對響應(yīng)做最后一步統(tǒng)一的處理
@app.after_request
def after_request(resp):
    print('每次視圖函數(shù)執(zhí)行之后執(zhí)行')
    return resp
# 每一次請求之后都會調(diào)用,會接受一個參數(shù),參數(shù)是服務(wù)器出現(xiàn)的錯誤信息
@app.teardown_request
def teardown_request(resp):
    print('請求結(jié)束時執(zhí)行!')
@app.route('/test1')
def test1():
    return "請求開始"
@app.route('/test2')
def test2():
    return "請求鉤子結(jié)束"
if __name__ == '__main__':
    app.run()
'''contex_processor: 當(dāng)項目中的所有模板都需要一個參數(shù)的時候,可以在context_processor鉤子函數(shù)定義,并且自動傳給所有模板,該函數(shù)一定要返回字典 '''

第一次執(zhí)行:

第二次執(zhí)行

1、通過對比可以發(fā)現(xiàn)第二次執(zhí)行時,@app.before_first_request 裝飾器并沒有執(zhí)行,因為在第一次調(diào)用時,就已經(jīng)把準(zhǔn)備工作做好。

2、它的工作如 在請求開始時,建立數(shù)據(jù)庫連接; 在請求開始時,根據(jù)需求進行權(quán)限校驗;

二、上下文

1.介紹

上下文:即語境,語意,在程序中可以理解為在代碼執(zhí)行到某一時刻時,根據(jù)之前代碼所做的操作以及下文即將要

執(zhí)行的邏輯,可以決定在當(dāng)前時刻下可以使用到的變量,或者可以完成的事情。

Flask中有兩種上下文,請求上下文和應(yīng)用上下文

Flask中上下文對象:相當(dāng)于一個容器,保存了 Flask 程序運行過程中的一些信息。

2.請求上下文

思考:在視圖函數(shù)中,如何取到當(dāng)前請求的相關(guān)數(shù)據(jù)?

比如:請求地址,請求方式,cookie等等

在 flask 中,可以直接在視圖函數(shù)中使用 request 這個對象進行獲取相關(guān)數(shù)據(jù),而 request 就是請求上下文的對象,保存了當(dāng)前本次請求的相關(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’獲取用戶信息。

3.應(yīng)用上下文

它的字面意思是 應(yīng)用上下文,但它不是一直存在的,它只是request context 中的一個對 app 的代理(人),所謂

local proxy。它的作用主要是幫助 request 獲取當(dāng)前的應(yīng)用,它是伴 request 而生,隨 request 而滅的。

應(yīng)用上下文對象有:current_app,g

current_app

應(yīng)用程序上下文,用于存儲應(yīng)用程序中的變量,可以通過current_app.name打印當(dāng)前app的名稱,也可以在

current_app中存儲一些變量,例如:

應(yīng)用的啟動腳本是哪個文件,啟動時指定了哪些參數(shù)

加載了哪些配置文件,導(dǎo)入了哪些配置

連了哪個數(shù)據(jù)庫

有哪些public的工具類、常量

應(yīng)用跑再哪個機器上,IP多少,內(nèi)存多大

注意:

current_app 就是當(dāng)前運行的flask app,在代碼不方便直接操作flask的app對象時,可以操作current_app就等 價于操作flask app對象

代碼示例

from flask import Flask, current_app
app= Flask(__name__)
# 以ywx客戶端對象為例
# 用字符串表示創(chuàng)建的ywx客戶端
# 為了方便在各個視圖中使用,將創(chuàng)建的ywx客戶端對象保存到flask app中,
# 后續(xù)可以在視圖中使用current_app.ywx獲取
app.ywx = 'hello flask'
@app.route('/test')
def test():
	return current_app.ywx
if __name__ == '__main__':
    app.run()

客戶端請求界面:

4.G對象

  • g 作為 flask 程序全局的一個臨時變量,充當(dāng)中間媒介的作用,我們可以通過它在一次請求調(diào)用的多個函數(shù)間傳遞一些數(shù)據(jù)。
  • 每次請求都會重設(shè)這個變量。

g對象可以結(jié)合前面學(xué)的藍圖來使用(感興趣的可以去看前面章節(jié)flask 藍圖學(xué)習(xí))

在藍圖包中創(chuàng)建一個新的藍圖:

在創(chuàng)建定義 g變量py文件。

3. 在整個項目里面建一個調(diào)用g變量的py文件

4. 在應(yīng)用程序中調(diào)用g變量

5. 在服務(wù)器端可以訪問得到

在瀏覽器端界面

三、異常處理

1.HTTP異常主動拋出

abort 方法

拋出一個給定狀態(tài)代碼的 HTTPException 或者 指定響應(yīng),例如想要用一個 頁面未找到異常來終止請 求,你可以調(diào)用 abort(404)。

參數(shù):

code – HTTP的錯誤狀態(tài)

abort(404)

abort(500)

拋出狀態(tài)碼的話,只能拋出 HTTP 協(xié)議的錯誤狀態(tài)碼

2.捕獲錯誤

errorhandler 裝飾器

注冊一個錯誤處理程序,當(dāng)程序拋出指定錯誤狀態(tài)碼的時候,就會調(diào)用該裝飾器所裝飾的方法

參數(shù):

code_or_exception – HTTP的錯誤狀態(tài)碼或指定異

1.可以在templates下新建html報錯文件,通過errorhandler 裝飾器 當(dāng)報指定的錯誤時,可以通過render_template函數(shù)。

2.將其報錯信息跳轉(zhuǎn)到客戶端(瀏覽器)顯示

from flask import *
app=Flask(__name__)
@app.route('/')
def hello_world():
    1/0
    #接受一個請求參數(shù)
    name=request.args.get('name')
    if name:
        print(name)
    else:
        abort(500)
        print('后面代碼不執(zhí)行')
        return 'hello world!'
@app.errorhandler(404)
def error_ym(error):
    print(error)
    return render_template('404.html'),404
@app.errorhandler(500)
def error_sr(error):
    print(error)
    return render_template('500.html'),500
if __name__ == '__main__':
    app.run()

請求出錯時顯示自定義的報錯信息!

自定義的html報錯文件

到此這篇關(guān)于Flask請求鉤子與上下文及異常處理分項精解的文章就介紹到這了,更多相關(guān)Flask請求鉤子內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python內(nèi)置加密模塊用法解析

    Python內(nèi)置加密模塊用法解析

    這篇文章主要介紹了Python內(nèi)置加密模塊用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • python使用pip成功導(dǎo)入庫后還是報錯的解決方法(針對vscode)

    python使用pip成功導(dǎo)入庫后還是報錯的解決方法(針對vscode)

    最近在學(xué)爬蟲,但在使用Scrapy包時,在終端通過pip裝好包以后,在pycharm中導(dǎo)入包時,依然會報錯,下面這篇文章主要給大家介紹了關(guān)于python使用pip成功導(dǎo)入庫后還是報錯的解決方法,需要的朋友可以參考下
    2022-07-07
  • python爬蟲之requests庫的使用詳解

    python爬蟲之requests庫的使用詳解

    這篇文章主要為大家介紹了python爬蟲之requests庫的使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • Python pandas 計算每行的增長率與累計增長率

    Python pandas 計算每行的增長率與累計增長率

    這篇文章主要介紹了Python pandas 計算每行的增長率與累計增長率,文章舉例詳細(xì)說明。需要的小伙伴可以參考一下
    2022-03-03
  • 梯度下降法介紹及利用Python實現(xiàn)的方法示例

    梯度下降法介紹及利用Python實現(xiàn)的方法示例

    梯度下降算法是一個很基本的算法,在機器學(xué)習(xí)和優(yōu)化中有著非常重要的作用,下面這篇文章主要給大家介紹了關(guān)于利用Python實現(xiàn)梯度下降法的相關(guān)資料,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Pandas通過index選擇并獲取行和列

    Pandas通過index選擇并獲取行和列

    本文主要介紹了Pandas通過index選擇并獲取行和列,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python 如何把docker-compose.yaml導(dǎo)入到數(shù)據(jù)庫相關(guān)條目里

    python 如何把docker-compose.yaml導(dǎo)入到數(shù)據(jù)庫相關(guān)條目里

    這篇文章主要介紹了python 如何把docker-compose.yaml導(dǎo)入到數(shù)據(jù)庫相關(guān)條目里?下面小編就為大家介紹一下實現(xiàn)方式,一起跟隨小編過來看看吧
    2021-01-01
  • Python入門教程4. 元組基本操作

    Python入門教程4. 元組基本操作

    這篇文章主要介紹了Python元組基本操作,簡單介紹了元組的創(chuàng)建、count方法元素統(tǒng)計、index方法元素獲取等相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2018-10-10
  • Python中利用aiohttp制作異步爬蟲及簡單應(yīng)用

    Python中利用aiohttp制作異步爬蟲及簡單應(yīng)用

    asyncio可以實現(xiàn)單線程并發(fā)IO操作,是Python中常用的異步處理模塊。這篇文章主要介紹了Python中利用aiohttp制作異步爬蟲的相關(guān)知識,需要的朋友可以參考下
    2018-11-11
  • python實習(xí)總結(jié)(yeild,async,azwait和協(xié)程)

    python實習(xí)總結(jié)(yeild,async,azwait和協(xié)程)

    今天是Python實習(xí)的第一天,熟悉了環(huán)境,第一次使用macbook,氛圍還不錯,努力學(xué)習(xí)新知識,希望本片文章能給你帶來幫助
    2021-10-10

最新評論