在 Sanic 应用中使用内存缓存管理 IP 黑名单
[外链图片转存中…(img-Pm0K9mzd-1734859380698)]
在现代 web 应用中,保护 API 接口免受恶意请求的攻击至关重要。IP 黑名单是一种常见的安全措施,可以有效阻止某些 IP 地址的访问。本文将介绍如何在 Python 的 Sanic 框架中实现 IP 黑名单功能,并结合内存缓存提升性能。
1. 环境准备
首先,确保你已经安装了 Sanic 和必要的数据库驱动程序。我们将使用 aiomysql 作为 MySQL 的异步驱动。可以使用以下命令进行安装:
pip install sanic aiomysql
2. 创建数据库表
我们需要一个数据库表来存储黑名单 IP。可以使用以下 SQL 语句创建表:
CREATE TABLE api_ip_blacklist (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '唯一标识',ip_address VARCHAR(45) NOT NULL COMMENT '被拦截的 IP 地址,支持 IPv4 和 IPv6',status TINYINT DEFAULT 1 COMMENT '状态,1 表示有效(黑名单),0 表示无效(可用)',reason VARCHAR(255) DEFAULT NULL COMMENT '记录添加到黑名单的原因',create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录最后更新时间',UNIQUE KEY (ip_address) COMMENT '确保 IP 地址唯一'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API 接口黑名单 IP 表';
3. 实现内存缓存
我们可以创建一个 CacheObject 类来管理内存中的黑名单 IP 缓存。以下是该类的实现:
class CacheObject(object):def __init__(self):self.data = dict()def put(self, key, value):"""将 IP 地址放入缓存"""self.data[key] = valuedef get(self, key):"""从缓存中获取 IP 地址的状态"""return self.data.get(key)def load_blacklist(self, ip_list):"""从数据库加载黑名单 IP 到缓存"""for ip in ip_list:self.put(ip, 1) # 1 表示有效(黑名单)def clear(self):"""清空缓存"""self.data.clear()
4. 集成 Sanic 应用
接下来,我们将 CacheObject 集成到 Sanic 应用中,实现动态加载和检查黑名单功能。
from sanic import Sanic, response
from sanic.exceptions import Forbidden
import aiomysql
import asyncioapp = Sanic("IPBlacklistApp")# 创建 CacheObject 实例
blacklist_cache = CacheObject()# 数据库配置
DB_CONFIG = {'host': 'localhost','port': 3306,'user': 'your_username','password': 'your_password','db': 'your_database'
}async def load_blacklist():async with aiomysql.connect(**DB_CONFIG) as conn:async with conn.cursor() as cursor:await cursor.execute("SELECT ip_address FROM api_ip_blacklist WHERE status = 1")rows = await cursor.fetchall()blacklist_cache.load_blacklist([row[0] for row in rows]) # 加载黑名单到缓存async def update_blacklist():while True:await load_blacklist()await asyncio.sleep(60) # 每60秒更新一次黑名单@app.listener('before_server_start')
async def setup_db(app, loop):await load_blacklist() # 启动时加载黑名单到缓存app.add_task(update_blacklist()) # 定时更新黑名单@app.middleware("request")
async def block_blacklisted_ips(request):client_ip = request.ipif blacklist_cache.get(client_ip) == 1: # 检查 IP 是否在黑名单中raise Forbidden("Your IP address is blocked.")@app.route("/")
async def index(request):return response.json({"message": "Welcome to the API!"})@app.route("/data")
async def data(request):return response.json({"data": "Here is your data!"})if __name__ == "__main__":app.run(host="0.0.0.0", port=8000)
5. 代码解析
- 数据库连接:使用
aiomysql连接到 MySQL 数据库并查询黑名单 IP。 - 内存缓存:通过
CacheObject类将黑名单 IP 缓存到内存中,提高查询效率。 - 中间件:在请求处理中检查客户端 IP 是否在黑名单中,若在则抛出 Forbidden 异常。
6. 测试应用
启动应用后,您可以通过 Postman 或浏览器访问接口。确保数据库中有有效的黑名单 IP 数据。访问黑名单 IP 时,您将收到 403 Forbidden 响应,表示该 IP 被阻止。
7. 总结
通过结合 Sanic 框架和内存缓存,我们成功实现了一个高效的 IP 黑名单管理系统。这种方法有效地提高了查询速度,减少了对数据库的频繁访问,为 API 接口提供了更好的安全保障。
相关文章:
在 Sanic 应用中使用内存缓存管理 IP 黑名单
[外链图片转存中…(img-Pm0K9mzd-1734859380698)] 在现代 web 应用中,保护 API 接口免受恶意请求的攻击至关重要。IP 黑名单是一种常见的安全措施,可以有效阻止某些 IP 地址的访问。本文将介绍如何在 Python 的 Sanic 框架中实现 IP 黑名单功能…...
可翻折的CPCI导冷板卡插拔机构
本技术涉及一种cpci板卡模块拔插,尤其涉及一种可翻折的cpci导冷板卡插拔机构。 背景技术: 1、cpci(compactpci)导冷板卡是一种基于compactpci计算机总线标准的卡式电子模块,它在标准的cpci架构之上增加了导热板来提高散热能力,常…...
面试题整理9----谈谈对k8s的理解2
面试题整理9----谈谈对k8s的理解2 1. Service 资源1.1 ServiceClusterIPNodePortLoadBalancerIngressExternalName 1.2 Endpoints1.3 Ingress1.4 EndpointSlice1.5 IngressClass 2. 配置和存储资源2.1 ConfigMap2.2 Secret2.3 PersistentVolume2.4 PersistentVolumeClaim2.5 St…...
12个城市人文扫街、旅拍、人像风光摄影后期Lightroom调色预设
12个城市人文扫街、旅拍、人像风光摄影后期Lightroom调色预设 12 个专为城市场景设计的专业 Adobe Lightroom 预设。只需单击一下,即可通过一致、专业的基础简化您的编辑流程。 Lightroom & Lightroom Classic,桌面和移动兼容包括 12 张由 pat_kay…...
无人设备遥控器之数传功率篇
一、数传功率的基本概念 数传功率是指遥控器发射端在传输数据时所使用的功率。这个功率值直接影响了数据传输的距离和信号强度。一般来说,数传功率越大,遥控器与无人设备之间的通信距离就越远,信号强度也相应增强。 二、数传功率的调节与选择…...
灭屏情况下,飞行模式+静音模式+插耳,播放音乐,电流异常
1. 功耗现象 灭屏情况下,飞行模式静音模式插耳,播放音乐,电流异常 1.1测试数据 飞行模式静音模式插耳机 原生音乐播放器 DriverOnly 32.5mA User版本 45mA 1.2 电流波形现象 上述看怀疑 CPU 未进入 Deep idle 导致? 2. …...
面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制
🎯导读:本文档详细描述了一个基于Spring Cloud Gateway的微服务网关及Admin服务的实现。网关通过定义路由规则,利用负载均衡将请求转发至不同的后端服务,并集成了Token验证过滤器以确保API的安全访问,同时支持白名单路…...
Jmeter负载测试如何找到最大并发用户数?
在性能测试中,当我们接到项目任务时,很多时候我们是不知道待测接口能支持多少并发用户数的。此时,需要我们先做负载测试,通过逐步加压,来找到最大并发用户数。那么当我们找到一个区间,怎么找到具体的值呢&a…...
Spark-Streaming集成Kafka
Spark Streaming集成Kafka是生产上最多的方式,其中集成Kafka 0.10是较为简单的,即:Kafka分区和Spark分区之间是1:1的对应关系,以及对偏移量和元数据的访问。与高版本的Kafka Consumer API 集成时做了一些调整,下面我们…...
移植 OLLVM 到 Android NDK,Android Studio 中使用 OLLVM
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ OLLVM、LLVM 与 Android NDK 在 Android NDK 中,LLVM/Clang 是默认的编译器。自 Android NDK r18 开始,Google 弃用了 GCC,…...
DAY36|动态规划Part04|LeetCode:1049. 最后一块石头的重量 II、494. 目标和、474.一和零
目录 LeetCode:1049. 最后一块石头的重量 II 基本思路 C代码 LeetCode:494. 目标和 基本思路 C代码 LeetCode:474.一和零 基本思路 C代码 LeetCode:1049. 最后一块石头的重量 II 力扣代码链接 文字讲解:LeetCode:1049. 最后一块石头的重量 II 视频讲解&…...
Linux 下SVN新手操作手册
下面来介绍Linux 下 SVN操作方法: 1、SVN的安装 Centos 7 安装Subversion sudo yum -y install subversion Ubuntu 安装Subversion sudo apt-get install subversion 自定义安装,官方地址:https://subversion.apache.org/ 2、SVN的使用…...
障碍感知 | 基于KD树的障碍物快速处理(附案例分析与ROS C++仿真)
目录 1 障碍处理与KD树2 KD树核心原理2.1 KD树的构造2.2 KD树的查找 3 仿真实现3.1 KD树基本算法3.2 ROS C仿真 1 障碍处理与KD树 在机器人感知系统中,传感器(如激光雷达、摄像头等)会采集周围的环境数据,例如代价地图、八叉树地…...
Electron -- Electron Fiddle(一)
Electron Fiddle 是一个由 Electron 团队开发的开源工具,它允许开发者快速创建、运行和调试 Electron 应用。这个工具提供了一个简洁的界面,使用户无需配置复杂的开发环境,就能快速体验和学习 Electron。强烈建议将其安装为学习工具。 学习它…...
详解Redis的常用命令
目录 KEYS 语法 EXISTS 语法 DEL 语法 EXPIRE 语法 TTL 语法 TYPE 语法 Redis数据结构和内部编码 KEYS 返回所有满⾜样式(pattern)的 key。 返回值:匹配 pattern 的所有 key。 语法 ⽀持如下统配样式: h?llo matches hello, ha…...
elasticache备份
Elasticsearch 本地快照操作流程 配置快照存储路径 在 elasticsearch.yml 文件中配置以下字段以指定数据、日志和快照存储路径:path:data: /data/data # 数据存储路径logs: /data/log # 日志存储路径repo: /data/snapshot # 快照存储路径确保路径 /dat…...
Tomcat负载均衡全解析
一、Java项目概述 (一)Java语言特点 Java是一种计算机应用语言,在开发王者和管理系统等方面有着广泛的应用。它具有开源免费的特性,不过需要注意的是,虽然语言本身开源,但是后期开发工具可能会收取费用。 (二)、JDK和Tomcat 1,JDK:作为Java语言的开发工具,在Linu…...
[LeetCode-Python版] 定长滑动窗口8——2461. 长度为 K 子数组中的最大和
题目 给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和: 子数组的长度是 k,且 子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回 0 。…...
springboot476基于vue篮球联盟管理系统(论文+源码)_kaic
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统篮球联盟管理系统信息管理难度大,容错率低&am…...
预约参观华为基地,见证行业巅峰
✨ 大家好呀!今天要跟大家分享一个超酷的体验,关于华为的参观学习之旅!🚀 华为成立于1987年,位于深圳,是全球领先的信息与通信技术(ICT)解决方案供应商哦!他们专注于科技…...
asp毕业设计下载(全套源码+配套论文)——基于asp+access的会员管理系统设计与实现
基于aspaccess的会员管理系统设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于aspaccess的会员管理系统设计与实现,更多精选毕业设计项目实例见文末哦。 文章目录: 基于aspaccess的会员管理系统设计与实现&a…...
Ostrakon-VL-8B高算力适配:RTX 4090D显存17GB极限压测与优化记录
Ostrakon-VL-8B高算力适配:RTX 4090D显存17GB极限压测与优化记录 1. 引言:当零售AI遇上顶级显卡 最近在部署一个专门为餐饮零售场景优化的多模态大模型——Ostrakon-VL-8B时,遇到了一个有趣的挑战。这个模型基于Qwen3-VL-8B微调,…...
哔哩下载姬(downkyi)终极指南:简单三步掌握B站视频批量下载与处理技巧
哔哩下载姬(downkyi)终极指南:简单三步掌握B站视频批量下载与处理技巧 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、…...
让 Claude Code 帮你“看家“:Hooks 与 /loop 入门
让 Claude Code 帮你"看家":Hooks 与 /loop 入门 上周我把一个重构任务扔给 Claude,出门开了两小时会。回来发现它把 .env.production 改了。 那一刻我才意识到,单纯会用 Claude Code 还不够,你还得学会怎么管住它。折…...
OpenClaw权限管理:GLM-4.7-Flash敏感操作的安全确认机制
OpenClaw权限管理:GLM-4.7-Flash敏感操作的安全确认机制 1. 为什么需要安全确认机制 上周我在用OpenClaw自动整理项目文档时,差点酿成一场灾难。当时AI助手误将/Users/me/Documents/project识别为临时文件夹,准备执行rm -rf清理操作——如果…...
智能商业洞察平台的多源数据融合:AI应用架构师的6个踩坑与解决方法
智能商业洞察平台的多源数据融合:AI应用架构师的6个踩坑与解决方法 一、引言 (Introduction) 钩子 (The Hook) 在当今数字化浪潮下,企业犹如置身数据的海洋,海量数据从各个业务系统、社交媒体、物联网设备等多源渠道滚滚而来。想象一下,作为 AI 应用架构师,负责构建智能…...
批量发短信接口的数据格式设计:CSV、JSON还是XML?
在开发者对接批量发短信接口的实际开发中,数据格式的选型是核心技术环节,CSV、JSON、XML三种主流格式各有技术特性,适配不同的业务场景。选品不当易导致数据解析效率低、接口调用失败、批量发送卡顿等问题。本文将从接口对接的核心诉求出发&a…...
CompactGUI社区数据库:游戏压缩效果的终极共享指南
CompactGUI社区数据库:游戏压缩效果的终极共享指南 【免费下载链接】CompactGUI Transparently compress active games and programs using Windows 10/11 APIs 项目地址: https://gitcode.com/gh_mirrors/co/CompactGUI 你是否曾为电脑存储空间不足而烦恼&a…...
ProDino MKR Zero工业RS-485与LoRaWAN开发指南
1. ProDino MKR Zero 硬件平台与配套库深度解析ProDino MKR Zero 是 KMP(KMP Electronics)面向工业物联网边缘节点推出的紧凑型 ARM Cortex-M0 开发平台,基于 Microchip SAMD21G18A 微控制器(48MHz 主频、256KB Flash、32KB SRAM&…...
OpenClaw对接GLM-4.7-Flash:模型性能优化指南
OpenClaw对接GLM-4.7-Flash:模型性能优化指南 1. 为什么需要专门优化GLM-4.7-Flash的对接? 上个月我在本地部署了OpenClawGLM-4.7-Flash组合,原本期待它能流畅处理我的自动化办公需求,结果遭遇了典型的"水土不服"症状…...
