????????在 Flask 框架中,?提供了幾種類型的鉤子(類似于Django的中間件),它們是在請求的不同階段自動調用的函數。這些鉤子讓你能夠對請求和響應的處理流程進行擴展,而無需修改核心代碼。
Flask鉤子的四種類型
- before_first_request:在處理第一個請求前調用,只執行一次。(Blueprint沒有這個鉤子)
- before_request:在每個請求之前調用。
- after_request:如果未觸發異常,則在每個請求之后調用,用于處理響應。
- teardown_request:無論請求是否成功完成,都會在每個請求之后調用,常用于關閉資源,如數據庫連接。
利用鉤子和緩存實現封IP
? ? ? ? 思路:要實現這樣的功能,你可以使用Flask的before_request
鉤子函數,并結合一個簡單的緩存機制來跟蹤每個IP的請求頻率。使用Flask-Caching
擴展可以處理緩存需求,包括存儲和清理IP地址的訪問記錄。下面是如何使用Flask-Caching
來實現防止IP頻繁訪問的示例:
from flask import Blueprint, render_template, request, abort
from flask_caching import Cacheapp = Flask(__name__)# 配置緩存
app.config['CACHE_TYPE'] = 'simple' # 使用簡單的內存緩存
cache = Cache(app)# 定義一個名為limit_remote_addr的函數,用于限制客戶端IP的請求次數
@app.before_request
def limit_remote_addr():# 獲取客戶端的IP地址client_ip = request.remote_addr# 生成緩存鍵值,用于存儲客戶端IP的請求次數cache_key = 'ip_limit_' + client_ip# 從緩存中獲取客戶端IP的請求次數request_count = cache.get(cache_key)# 如果緩存中沒有該客戶端IP的請求次數,則初始化為0if request_count is None:request_count = 0print(request_count)# 如果客戶端IP的請求次數大于等于5次,封禁IPif request_count >= 2:# 將客戶端IP的請求次數重置為0,并設置緩存超時時間為10秒(封禁10秒)cache.set(cache_key, request_count + 1, timeout=10)abort(429) # Too Many Requests HTTP狀態碼else:# 如果客戶端IP的請求次數小于5次,將其請求次數加1,并設置緩存超時時間為1秒cache.set(cache_key, request_count + 1, timeout=1)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run()
?