Flask(中間件與全局變量 九)

中間件 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
登陸

訪問首頁

首頁
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章