flask-钩子函数使用

一、钩子函数的概念
钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。

二、常用的三大钩子函数

一  before_first_request

        注册一个函数,在处理第一个请求之前运行.

  1. @app.before_first_request
  2. def bf_first_request():
  3. g.string = 'before_first_request'

       运行程序,调用http://localhost:5000/test会显示g中传递的string变量

二 before_request

        注册一个函数,在处理每次请求之前运行.

  1. @app.before_request
  2. def bf_request():
  3. g.string = 'before_request'

三 after_request

        注册一个函数,在每次请求之后运行.注册的函数至少需要含有一个参数,这个参数实际上为服务器的响应,且函数中需要返回这个响应参数.

  1. @app.after_request
  2. def af_request(param):
  3. 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章