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