【PythonWeb開發】Flask中間件鉤子函數實現封IP

????????在 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()

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35789.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35789.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35789.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IT入門知識第八部分《云計算》(8/10)

目錄 云計算:現代技術的新篇章 1. 云計算基礎 1.1 云計算的起源和發展 云計算的早期概念 云計算的發展歷程 1.2 云計算的核心特點 按需自助服務 廣泛的網絡訪問 資源池化 快速彈性 按使用量付費 1.3 云計算的優勢和挑戰 成本效益 靈活性和可擴展性 維…

[leetcode]intersection-of-two-arrays-ii 兩個數組的交集 II

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());int length1 nums1.size(), length2 …

動態規劃——123. 買賣股票的最佳時機 III

目錄 1、題目鏈接 2、題目分析 1.狀態表示 2.狀態轉移方程 3.初始化 4.填表 5.返回值 3、代碼解析 1、題目鏈接 123. 買賣股票的最佳時機 III 2、題目分析 1.狀態表示 由題目可知&#xff0c;我們分為兩種狀態&#xff0c;買入和賣出&#xff0c;又因為只能完成兩次交易…

windows下如何配置vs code的編譯環境

在 Windows 上配置 VS Code 的編譯環境涉及安裝編譯器、配置 VS Code 以及編寫和運行代碼。以下是具體的步驟&#xff1a; 步驟 1&#xff1a;安裝必要的軟件 安裝 Visual Studio Code&#xff1a; 訪問 VS Code 的官方網站并下載安裝包。按照安裝向導進行安裝。 安裝 C/C 編譯…

盲源信道分離—FastICA算法性能仿真

本案例中使用Matlab軟件對FastICA算法的聲音分離性能進行了仿真&#xff0c;分別對簡單波形的混合信號、不同類型聲音的混合信號、同一類型的混合信號這三種情況進行仿真&#xff0c;主要從分離信號的波形形狀、串音誤差兩方面對分離性能進行衡量&#xff0c;仿真結果顯示快速I…

Gradle學習-3 Gradle構建的生命周期

Gradle常用文件目錄 Gradle 構建的生命周期&#xff0c;有3個階段: 初始化階段配置階段執行階段 1、初始化階段 Gradle 支持構建單個工程個多個子工程&#xff0c;初始化階段主要負責收集所有參與本次構建的子工程&#xff0c;創建一個項目的層次結構&#xff0c;并未每個…

SpringBoot優點達項目實戰:獲取系統配置接口(三)

SpringBoot優點達項目實戰&#xff1a;獲取系統配置接口&#xff08;二&#xff09; 文章目錄 SpringBoot優點達項目實戰&#xff1a;獲取系統配置接口&#xff08;二&#xff09;1、查看接口2、查看數據庫3、代碼實現1、創建實體類SysConfig2、創建返回數據的vo3、創建control…

【INTEL(ALTERA)】Eclipse Nios II SBT 無法從模板創建新應用程序和 BSP

目錄 說明 解決方法 說明 您應該能夠創建新的應用程序和 BSP 模板包含以下步驟&#xff1a; 選擇 Nios II應用程序和 BSP 來自模板。選擇您的.sopcinfo 文件并選擇模板。從您的工作區單擊 選擇現有的 BSP 項目。單擊 創建。選擇所需的 BSP 選項。單擊 完成。 但是&#xf…

API 安全策略和基礎指南

API 是當今數字創新計劃的核心&#xff0c;已成為應用程序的頭號攻擊載體。了解什么是 API 安全、為什么它如此重要&#xff0c;以及如何保護您的 API 免受現代威脅至關重要。 什么是 API 安全&#xff1f; 應用程序編程接口&#xff08;API&#xff09;是現代應用程序的基石…

PostgreSQL教程:開啟您的數據庫之旅

PostgreSQL教程&#xff1a;開啟您的數據庫之旅 PostgreSQL是一種開源的對象關系型數據庫管理系統&#xff08;ORDBMS&#xff09;&#xff0c;它以其強大的功能、穩定性和高度的可擴展性而聞名。作為一個功能豐富的數據庫系統&#xff0c;PostgreSQL支持復雜的查詢、強大的事…

Python 面試題解析

Python 面試題解析 Python 作為一種廣泛使用的編程語言&#xff0c;其面試題目通常覆蓋了語言基礎、數據結構、算法、設計模式、Web 開發、測試、數據庫、系統設計等多個方面。以下是一些常見的 Python 面試題及其解析&#xff0c;使用 Markdown 格式編寫。 1. Python 基礎 …

Linux-筆記 OverlayFS文件系統小應用

前言 通過另一章節 OverlayFS文件系統入門 中已經大致了解了原理&#xff0c;這里來實現一個小應用。

大模型性能優化KV Cache

原理 KV Cache的本質就是避免重復計算&#xff0c;把需要重復計算的結果進行緩存&#xff0c;生成式模型的新的token的產生需要用到之前的所有token的 K , V K,V K,V&#xff0c;在計算注意力的時候是當前的 Q Q Q和所有的 K , V K,V K,V來進行計算&#xff0c;所以是緩存 K ,…

打破數據分析壁壘:SPSS復習必備(九)

有序定性資料統計推斷 1.分類 單向有序行列表 雙向有序屬性相同行列表 雙向有序屬性不同行列表 2.單向有序行列表 秩和檢驗 ① 兩組單向有序分類資料 ②多組單向有序定性資料 步驟&#xff1a; 1.建立檢驗假設和確定檢驗水準 2.編秩 3.求秩和 4.確定檢驗統計量 5…

按位與、或、異或操作符

目錄 & --- 按位與操作符 按位與操作符運用規則 按位與操作符相關代碼 按位與操作符相關代碼驗證 | --- 按位或操作符 按位或操作符運用規則 按位或操作符相關代碼 按位或操作符相關代碼驗證 ^ --- 按位異或操作符 按位異或操作符運用規則 按位異或操作符相關代…

分頁組件 vue/uniapp

失效如上圖 1.父組件調用 <onion-pagination :page.sync="todusGameQuery.pageSize" @update:page="changeTodusLoadMore":pageSize="todusGameQuery.pageNum" :total="todusGameTotal"></onion-pagination> 2.組件封裝…

海納斯 hinas 的hi3798mv100 華為悅盒 6108v9 安裝wifi模塊

hi3798mv100安裝wifi模塊 1.執行腳本 &#xff0c;執行完畢后重啟服務器2. 繼續執行腳本3.檢查網卡驅動安裝是否正確4.查看網卡安裝狀態5.連接wifi結尾 1.執行腳本 &#xff0c;執行完畢后重啟服務器 bash <(curl -sSL https://gitee.com/xjxjin/scripts/raw/main/install_…

【開源項目】自然語言處理領域的明星項目推薦:Hugging Face Transformers

在當今人工智能與大數據飛速發展的時代&#xff0c;自然語言處理&#xff08;NLP&#xff09;已成為推動科技進步的重要力量。而在NLP領域&#xff0c;Hugging Face Transformers無疑是一個備受矚目的開源項目。本文將從項目介紹、代碼解釋以及技術特點等角度&#xff0c;為您深…

Leetcode Hot100之矩陣

1. 矩陣置零 題目描述 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 解題思路 題目要求進行原地更改&#xff0c;也就是不能使用額外的空間&#xff0c;因此我們可以使用第一行的元素來記錄對應的…

Java SpringBoot 打包后 獲取文件 打包后找不到文件 解決方法

在SpringBoot下 本地運行獲取項目下的文件是沒問題的&#xff0c;在打包后獲取則找不到文件 原因&#xff1a; 在Spring Boot項目中&#xff0c;當嘗試訪問項目下的文件時&#xff0c;本地開發環境和打包后的運行環境可能會有所不同。在本地開發時&#xff0c;通常可以直接通過…