Flask框架(10)

flask請求鉤子

Flask的請求鉤子指的是在執行視圖函數前後執行的一些函數,我們可以在這些函數裏面做一些操作。
Flask利用裝飾器給我們提供了四種鉤子函數。
before_first_request:在處理第一個請求前執行。比如鏈接數據庫操作
before_request:在每次請求前執行。比如權限校驗
after_request:每次請求之後調用,前提是沒有未處理的異常拋出
teardown_request:每次請求之後調用,即使有未處理的異常拋出

Flask裏面的鉤子跟Django裏面的中間件類似。

在第一次請求之前運行

@app.before_first_request
def before_first_request():
	print('before_first_request")

在每一次請求前都會執行

@app.before_request
 def before_request(): 
 print('before_request')

在請求之後運行

@app.after_request 
def after_request(response): 
# response: 就是前面的請求處理完畢之後, 返回的響應數據,前提是視圖函數沒有出現異常
 # 如果需要對響應做額外處理,可以再這裏進行 
 # json.dumps 配置請求鉤子
  # response.headers["Content-Type"] = "application/json" 
  print('after_request') 
  return response

無論視圖函數是否出現異常,每一次請求之後都會調用,會接受一個參數,參數是服務器出現的錯誤信息

@app.teardown_request
 def teardown_request(error):
  print('teardown_request: error %s' % error)

我們在瀏覽器第一次訪問:

before_first_reques
t before_request 
視圖函數執行
 after_reques
 t teardown_request:
  error None

我們在刷新瀏覽器試一下:

before_request
 視圖函數執行
  after_request 
  teardown_request: error None

上下文

request 和 session 都屬於請求上下文對象。
request:封裝了HTTP請求的內容,針對的是http請求。舉例:user = request.args.get(‘user’),獲取的是get請求的參數。
session:用來記錄請求會話中的信息,針對的是用戶信息。舉例:session[‘name’] = user.id,可以記錄用戶信息。還可以通過session.get(‘name’)獲取用戶信息。

請求上下文

將初始的初始request封裝RequestContext對象ctx

def request_context(self, environ): 
return RequestContext(self, environ)

藉助LocalStack對象將ctx放到Local對象中

_request_ctx_stack = LocalStack()
 _request_ctx_stack.push(self)

導入from flask import request,其中request對象是LocalProxy類的實例化對象

request = LocalProxy(partial(_lookup_req_object, 'request'))

應用上下文
from flask import g:在一次請求週期裏,用於存儲的變量,便於程序員傳遞變量的時候使用。
g變量是解決我們在一次請求過程傳遞參數的問題,我們可以往g變量塞很多屬性,在同一次請求中,可以從另一個函數中取出。當然也可以用函數參數這種方法解決,g變量適用於參數多的情況。

藍圖

使用裝飾器解決
例如我們把上面的home視圖抽出來,放到單獨的一個home.py文件中。在此文件只寫一個沒有被裝飾器裝飾的視圖函數。

def home(): 
return 'home page'

然後在Flask的啓動程序文件中,把home視圖在重新用裝飾器裝飾起來。

from home import home
# 裝飾home視圖 
app.route('/home')(home)

什麼是藍圖

藍圖:用於實現單個應用的視圖、模板、靜態文件的集合。

藍圖就是模塊化處理的類。

簡單來說,藍圖就是一個存儲操作路由映射方法的容器,主要用來實現客戶端請求和URL相互關聯的功能。 在Flask中,使用藍圖可以幫助我們實現模塊化應用的功能。

Flask中的藍圖有點像Django框架的app的意思。就是把一個項目模塊化,每個模塊所用的視圖、靜態文件、模板放在一個盒子裏。
使用藍圖
在使用藍圖之前,我們需要先創建藍圖,繼續那我們上面的home視圖函數舉例,把home.py文件裏面的代碼修改如下:

from flask import Blueprint
# app_home值藍圖的名稱,
 # __name__指藍圖所在模塊
 app_home = Blueprint('app_home', __name__)
 # 註冊藍圖路由
 @app_home.route('/home')
 def home():
  return 'home page'

Flask的啓動程序文件中,導入藍圖並註冊藍圖:

#導入藍圖
 from home import app_home
 # 註冊藍圖 
 app.register_blueprint(app_home)

在Flask中用url_prefix可以給藍圖模塊添加一個共同的地址。

app.register_blueprint(app_home, url_prefix='/user')

以藍圖模塊導入
把Flask中的藍圖用python中包的概念管理起來。
在__init__.py文件中創建藍圖:

from flask import Blueprint 
# app_home值藍圖的名稱, 
# __name__指藍圖所在模塊
 app_home = Blueprint('app_home', __name__) 
 from .views import home

在views.py文件中註冊藍圖路由:

from . import app_home
 # 註冊藍圖路由
  @app_home.route('/home') 
  def home(): 
  return 'home page'

在Flask啓動文件導入藍圖:

from flask import Flask 
# 導入藍圖
 from home import app_home
  app = Flask(__name__) 
  # 註冊藍圖 app.register_blueprint(app_home, url_prefix='/user') 
  @app.route('/')
   def index():
    return 'index page'
     if __name__ == '__main__': 
     # 0.0.0.0代表任何能代表這臺機器的地址都可以訪問 app.run(host='0.0.0.0', port=5000, debug=True) # 運行程序

我們修改一下home的視圖函數,改成加載模板:

from . import app_home 
from flask import render_template 
# 註冊藍圖路由
 @app_home.route('/home')
  def home(): 
  return render_template('home.html')

二、g對象

g:global

  1. g對象是專門用來保存用戶的數據的。
  2. g對象在一次請求中的所有的代碼的地方,都是可以使用的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章