一、钩子函数的概念
钩子函数是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)