Flask05 請求鉤子和異常捕獲

2021-09-20 18:28:50 字數 3816 閱讀 8641

異常捕獲

我們在寫專案的時候往往會有一些全域性性的需求,比如在應用啟動之初初始化一些資料,建立資料庫鏈結等。對發起的所有請求記錄一些資料,對某些請求進行一些攔截。在請求結束的時候自定義響應資料等。

針對這些全域性性的需求,flask框架提供了請求鉤子,所謂請求鉤子就是可以掛在請求和響應的不同階段,進行植入,攔截一些操作。請求鉤子以裝飾器的形式作用到知道一點的函式上,被作用的函式內部可以自定義具體的操作。根據被裝飾的請求鉤子,這些被裝飾的函式會在不同階段被觸發。下面介紹一下flask框架常用的三個請求鉤子:

before_first_request:

在處理第乙個請求前執行

before_request:

在每次請求前執行,如果在被裝飾的函式中返回了乙個響應,檢視函式將不再被執行。

after_request:

如果沒有丟擲錯誤,在每次請求後執行

接受乙個引數:此引數是檢視函式作出的響應

在此函式中可以對響應值在返回之前做最後一步修改處理

需要將引數中的響應在這個被裝飾的函式中進行返回

我們下面同時定義乙個檢視函式index和三個被裝飾的函式,分別在他們內部進行列印,然後看下他們的執行順序。

'/')

defindex()

:print

('index'

)return

'ok'

deffirst()

:print

('first'

)def

every()

:print

('every'

)def

after

(response)

:print

('after'

)return response

啟動之後請求index檢視函式,在控制台可以看到執行順序如下:

first

every

index

after

由此看出請求鉤子的執行順序為before_first_request->before_request->檢視函式index->after_request

再次請求index檢視函式,這次的在控制台看到的結果如下:

every

index

after

這次我們可以看到除了before_first_request這個鉤子函式不被執行之外,別的順序都沒有變化。

也就驗證了我們之前的說明,before_first_request鉤子只在第乙個請求前執行,befor_request在每次請求都執行,且在檢視函式之前執行,after_request在檢視函式執行之後執行,且要返回由檢視函式傳遞過來的響應。

下面我們把before_request鉤子作用的函式,改造成如下,看看會是什麼結果。

defevery()

:print

('every'

)return

'every'

# 如果返回結果,請求就直接從這裡返回了,而不再執行檢視函式了。

再次訪問index檢視函式,發現瀏覽器顯示every字樣。也同樣驗證了我們在上面的說明,如果before_request鉤子作用的函式有返回值,就在此返回,不再執行檢視函式了。

在before_first_request初始化變數並寫入session,由於此鉤子只在應用之初執行一次,所以不會重複初始化變數。然後,由於每次對**的請求都會執行befor_request鉤子,所以我們在其內部取到儲存在session中的變數,並且每請求一次就累計1,這樣就能起到統計**整體的瀏覽次數的目的,我們可以在任意檢視函式中從session中取到總的瀏覽次數,並顯示出來。**如下:

'/'

)def

index()

:return

'總瀏覽量:'

+str

(session[

'sum'])

# 從session中取出總次數並列印

defset_sum()

: session[

'sum']=

0# 初始化變數,並儲存到session當中

defadd_sum()

: session[

'sum']+=

1# 從session中取出總次數,每次請求都累計瀏覽總次數

執行以上**,訪問index檢視函式,可以看到每次重新整理頁面,總次數都會增加,有了上面的額思路分析和**注釋我想大家應該能清晰透徹的理解這段**的含義吧。

下面我們利用after_request鉤子能接收檢視函式傳遞來的響應這一特性,在響應中將使用者最後訪問**的時間記錄到cookie裡面。然後就可以在檢視函式中,通過cookie拿到使用者最後的訪問時間,然後展示出來。這裡要用到時間獲取包,和轉換時間格式的函式。記得引入datetime包。

# 引入datetime包

from datetime import datetime

'/')

defindex()

:print

('index'

)return

+str

(request.cookies.get(

'time'))

defrecord_login_time

(response)

: response.set_cookie(

'time'

,str

(datetime.now(

).strftime(

'%y-%m-%d %h:%m:%s'))

)return response

啟動服務之後,訪問index檢視函式,每次重新整理即會顯示最後訪問時間。

下面結合before_request鉤子的攔截特性,可以實現這樣的需求,可以在before_request請求鉤子內部判斷客戶端的位址,進行訪問控制,當然我們如果是在本地測試,那麼本地的客戶端位址就是127.0.0.1所以我們可以來判斷是否為此ip位址,如果是,就可以進行攔截,這樣的話,當我們再請求index檢視函式的時候,就已經不能訪問了,被攔截在了befor_request鉤子當中了。

'/')

defindex()

:return

'index'

defadd_sum()

: ip = request.__dict__[

'environ'][

'remote_addr'

]if ip ==

'127.0.0.1'

:return

'不允許訪問!'

驗證一下,是不是已經不能訪問index檢視函式了?瀏覽器顯示不允許訪問字樣即是驗證成功。

下面再介紹一下異常捕獲裝飾器。一般我們在訪問**的時候,如果訪問了乙個不存在的url,那麼**就會提示我們404錯誤,並告訴我們這個頁面不存在,那麼這個404頁面在乙個**中是同乙個頁面,訪問所有不存在的頁面都會跳到此頁面,那麼這個是怎麼做到的呢?下面我們同樣可以用裝飾器來實現。

404)

# 傳遞需要捕獲的狀態碼

deferror

(e):

# 將錯誤傳遞到被裝飾的函式內部

print

(e)return

'不存在的頁面'

# 自定義的顯示內容

此裝飾器接收乙個引數:http狀態碼。即表示我們要捕獲的錯誤狀態碼,同時要把錯誤異常傳遞到被裝飾的函式內部,此函式的返回結果即為我們在瀏覽器顯示的內容。這時如果我們訪問乙個不存在的頁面就會看到:不存在的頁面

Flask 請求鉤子

flask中具有四種鉤子被做成了修飾器,我們在後端可以進行呼叫做相關的操作.功能 defindex print 哈哈哈哈 return 哈哈哈 defbefore first request print 這是第乙個鉤子,只在第乙個請求之前呼叫,第乙個請求之後不再呼叫 效果 注意點 在每次請求的之前呼...

Flask 請求鉤子

首先了解下flask設計請求鉤子的作用是什麼,其實請求鉤子就是為了讓每個檢視函式避免編寫重複功能的 設施的功能。其實和scrapy,django中的中介軟體有點相似之處。請求鉤子的設計能夠很有效的提高 的質量,以及實現一些很好的應用場景。falsk有以下幾種鉤子 在處理第乙個請求前執行.應用場景 比...

Flask 請求鉤子

在django中有中介軟體這個類來做一些檢視執行前 執行中 執行後的一些額外業務處理,那麼在flask則是採用請求鉤子的方式來處理。在客戶端和伺服器互動的過程中,有些準備工作或掃尾工作需要處理,比如 在請求開始時,建立資料庫連線 在請求結束時,指定資料的互動格式。為了讓每個檢視函式避免編寫重複功能的...