中間件 middleware
request
當Flask應用處理請求時,它會根據從WSGI服務器收到的環境創建一個Request
對象.
因爲工作者(取決於服務器的線程,進程或者協程)一次只能處理一個請求,所以在該請求期間請求數據可被認爲是該工作者的全部數據。
Flask對此的術語爲本地請求
請求鉤子 before_request
在獲取某個請求數據之前,可以做額外的事情。
場景:運營-數據埋點
各個接口的訪問數量與頻次
@app.before_request
def get_num_of_interface():
# 從數據庫中讀取緩存數量
print("接口訪問數量的緩存+1")
# 將緩存數量+1後存入數據庫
場景:驗證是否登陸
@app.before_request
def get_num_of_interface():
sign = request.args.get('sign')
if sign != 'admin':
abort(401)
場景:操作時間大於一定時間後需要重新登陸
after_request
response
參數必須有return 的必須是一個Response對象
通常用來修改響應
如果視圖出現錯誤,不會調用
場景:封裝響應信息
@app.after_request
def make_res(response):
response.headers['server'] = 'zx'
print(f'after {request.url}')
return response
teardown_request
通常用來釋放資源
不管有沒有錯誤都會調用
場景:關閉數據庫連接
@app.teardown_request
def teardown_make_res(error):
print(error)
print("tear Down")
before_first_request
第一次請求的時候觸發
@app.before_first_request
def first():
print("第一次請求")
## 全局變量
g:同一個請求中 共享數據
from flask import g
場景:驗證用戶信息
可以在同一請求之間共享g
的內容,相當於實現了這個請求的一個全局變量
@app.before_request
def get_num_of_interface():
sign = request.args.get('sign')
if sign != 'admin':
abort(401)
# 獲取sign對於的用戶
a = sign + 'md'
g.user = a
@app.route('/')
def hello_world():
print(g.user)
return 'Hello World!'
場景:數據庫連接
def connect_to_database():
conn = pymysql.connect(host='127.0.0.1',
user='root',
password='123456',
db='zx',
charset='utf8mb4')
return conn.cursor()
@app.before_request
def get_db():
if 'db' not in g:
g.db = connect_to_database()
@app.teardown_request
def close_db(exception):
db = g.pop('db', None)
if db is not None:
db.close()
@app.route('/hi')
def hi():
g.db.execute('SELECT * FROM user_info;')
a = g.db.fetchall()
print(a)
session
用來記錄用戶會話信息
from flask import Flask, session, request
app = Flask(__name__)
app.config['SECRET_KEY'] = 'sfoowff'
@app.route('/')
def home():
if not session.get('user'):
return '你沒有登陸'
return '這是首頁'
@app.route('/login/')
def login():
username = request.args.get('username')
pwd = request.args.get('pwd')
if username and pwd:
session['user'] = username
return '登陸成功'
return '賬號密碼不能爲空'
@app.route('/logout/')
def logout():
session.pop('user', None)
return '登出'
if __name__ == '__main__':
app.run()
測試
http://127.0.0.1:5000/login/?username=zx&pwd=123
訪問首頁