一、鉤子函數的概念
鉤子函數是Windows消息處理機制的一部分,通過設置“鉤子”,應用程序可以在系統級對所有消息、事件進行過濾,訪問在正常情況下無法訪問的消息。鉤子的本質是一段用以處理系統消息的程序,通過系統調用,把它掛入系統。
二、常用的三大鉤子函數
一 before_first_request
註冊一個函數,在處理第一個請求之前運行.
- @app.before_first_request
- def bf_first_request():
- g.string = 'before_first_request'
運行程序,調用http://localhost:5000/test會顯示g中傳遞的string變量
二 before_request
註冊一個函數,在處理每次請求之前運行.
- @app.before_request
- def bf_request():
- g.string = 'before_request'
三 after_request
註冊一個函數,在每次請求之後運行.註冊的函數至少需要含有一個參數,這個參數實際上爲服務器的響應,且函數中需要返回這個響應參數.
- @app.after_request
- def af_request(param):
- return param
三、主要解決的實際問題(代碼奉上)
–1.訪問頻率的限制
–2.封爬蟲的ip
import time
from flask import request
from flask_restful import abort
from FlaskApi.App.ext import cache
PATH_LIST = ["/goods/"]
PERMISSION_BUY_LIST = []
def load_middleware(app):
@app.before_request
def before():
path = request.path
if not path.startswith("/_debug"):
ip = request.remote_addr
black_list = cache.get("black") or []
if ip in black_list:
# abort(400, message="小夥子,爬蟲獲取十條數據就是三年")
return "小夥子,爬蟲獲取十條數據就是三年", 400
request_list = cache.get(ip)
if request_list:
"""
[11:42:05, 11:42:07, 11:43:10, 11:43:33]
反轉時間
[11:47:50, 11:47:30, 11:47:22, 11:46:55...]
"""
while request_list and time.time() - request_list[-1] >= 60:
request_list.pop()
if len(request_list) > 60:
black_list.append(ip)
cache.set("black", black_list, timeout=60*60*24)
# abort(400, message="小爬蟲回家睡覺吧")
return "小爬蟲回家睡覺吧", 400
if len(request_list) > 30:
request_list.insert(0, time.time())
cache.set(ip, request_list, timeout=60)
return "您的請求頻率過高"
else:
request_list = []
print(ip, len(request_list))
request_list.insert(0, time.time())
cache.set(ip, request_list, timeout=60)