[ Django ] 统计接口访问频次

 需求及实现思路

需求:统计django项目中接口的调用次数

思路:中间件+异步任务celery+缓存redis/直接使用中间件(会增加中间件的压力)

具体思路:

  • 定义中间件,在中间件中响应走的时候判断该请求的url是否存在【status_code != 404】,存在则统计, 否则不统计。
  • 中间件中调用异步任务,异步任务用celery实现。
  • 异步任务做的事情就是在缓存中放一个字典,字典的key是访问的接口url,字典的值是该接口访问的次数。
  • 缓存使用redis,在django项目中使用django-redis模块,替换django默认的缓存方式。
  • 实现效果

代码实现

  • 配置缓存
# settings.py

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",			# 使用django-redis的缓存
        "LOCATION": "redis://127.0.0.1:6379/0",				# redis数据库的位置
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
            "DECODE_RESPONSES": True,					# 自动将byte转成字符串
            "PASSWORD": "",						# 设置密码
        }
    }
}
  • 自定义中间件
# utils--->middle_throttle.py

from django.utils.deprecation import MiddlewareMixin
from celery_task.task import get_api_throttle

class Throttle(MiddlewareMixin):

    def process_response(self, request, response):
        url = request.path 
        if not response.status_code == 404: # 只统计能够访问到的接口
            get_api_throttle(url)
        return response
    
    
#  需要在配置文件中添加中间件
MIDDLEWARE = [
    ....
    'corsheaders.middleware.CorsMiddleware',
    # 统计接口频率中间件
    'luffyapi.utils.middle_throttle.Throttle'
]
  • 包管理的方式实现异步任务
# celery_task--->task.py
import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffyapi.settings.dev")
import django
django.setup()

@app.task
def get_api_throttle(url):
    conn.hincrby('api_throttle_hash', url, amount=1)
    return True
  • 通过命令开启worker即可
# linux/mac
        celery worker -A celery_task -l info		# celery_task是包名
        
# windows:
        windows上如果通过上述命令启动失败或者后期执行任务失败则借助eventlet模块启动
        pip3 install eventlet
        celery worker -A celery_task -l info -P eventlet

补充:不使用异步调用任务,直接使用中间件实现统计接口访问频次

from django.utils.deprecation import MiddlewareMixin
from .redis_pool import conn

class Throttle(MiddlewareMixin):
    def process_response(self,request,response):
        url = request.path()
        if  not response.status_code == 404:
            conn.hincrby('api_throttle_hash',url,amount=1)

            
#  需要在配置文件中添加中间件
MIDDLEWARE = [
    ....
    'corsheaders.middleware.CorsMiddleware',
    # 统计接口频率中间件
    'luffyapi.utils.middle_throttle.Throttle'
]

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/477048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【吾爱破解】Android初级题(二)的解题思路 _

拿到apk,我们模拟器打开看一下 好好,抽卡模拟器是吧😀 jadx反编译看一下源码 找到生成flag的地方,大概逻辑就是 java signatureArr getPackageManager().getPackageInfo(getPackageName(), 64).signaturesfor (int i 0; i &l…

综合知识篇15-开发管理考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

C# 读取二维数组集合输出到Word预设表格

目录 应用场景 设计约定 范例运行环境 配置Office DCOM 实现代码 组件库引入 核心代码 DataSet转二维数组 导出写入WORD表格 调用举例 小结 应用场景 存储或导出个人WORD版简历是招聘应用系统中的常用功能,我们通常会通过应用系统采集用户的个人简历信息…

01、Lua 入门教程

Lua 入门教程 Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua是巴西里约热内卢天主教大学(Pontifical Catholic University of…

使用uni-app框架进行移动端的适配(uniapp px转rpx)

1、打开uniapp 官网找到 插件市场介绍2、点击插件市场 px2rpx - DCloud 插件市场3、选择使用HBuilderX导入插件4、在HBuilder中点击右键选择开启px2rpx 5、开启成功后会有提示 6、根据设计搞的尺寸就行,我的是在这750*1620的,正常写px,保存…

ES6中的Set集合

Set集合 ES6 提供了新的数据结构Set(集合)。 它类似于数组,但成员的值都是唯一的集合实现了 iterator 接口,所以可以使用「扩展运算符」和[for…of…」进行遍历集合的属性和方法 集合的属性和方法: 1)size,返回集合的元…

Java-SSM学生信息管理统

Java-SSM学生信息管理统 1.服务承诺: 包安装运行,如有需要欢迎联系(VX:yuanchengruanjian)。 2.项目所用框架: 前端:JSP、layui等。 后端:SSM,即Spring、SpringMvc、Mybatis等。 3.项目功能点: 1.前台功能: 1.注册、登录 2.课程…

分布式链上随机数和keyless account

1. 引言 相关论文见: Aptos团队2024年论文 Distributed Randomness using Weighted VRFs 相关代码实现见: https://github.com/aptos-labs/aptos-core(Rust) 在链中生成和集成共享随机数,以扩展应用和强化安全。该…

四、C语言中的数组:如何输入与输出二维数组(数组,完)

本章的学习内容如下 四、C语言中的数组:数组的创建与初始化四、C语言中的数组:数组的输入与元素个数C语言—第6次作业—十道代码题掌握一维数组四、C语言中的数组:二维数组 1.二维数组的输入与输出 当我们输入一维数组时需要一个循环来遍历…

经典Bug永流传---每周一“虫”(四十五)

如果有人错过机会,多半不是机会没来,而是因为机会过来时,没有一伸手抓住它。 大写W惹的祸 前提: A账号已登录 步骤: 打开某商品链接,然后在商品的评论区任意一条评论,点击回复,回…

Flink入门知识点汇总(一)

具体内容请看b站尚硅谷课程! 32_Flink运行时架构_提交流程_Yarn应用模式_哔哩哔哩_bilibili Flink本身有状态机制,状态都存储在Flink内部结构中,无需集成Mysql等对于精确一次Exactly-once,Flink进行了相关的配置,无需像…

爱因斯坦可以教给在机器学习中利用对称性

爱因斯坦可以教给我们关于机器学习的知识 在机器学习中利用对称性 目录 一、说明二、物理学中的对称性三、机器学习中的对称性四、卷积神经网络 (CNN) 中的对称性五、将对称性集成到机器学习中,用于平面图像及其他图像六、引用 一、说明 在许…

【MySQL】对表的相关操作(DDL)

👦个人主页:Weraphael ✍🏻作者简介:目前学习计网、mysql和算法 ✈️专栏:MySQL学习 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

[Python人工智能] 四十四.命名实体识别 (5)利用bert4keras构建Bert-CRF实体识别模型(实体位置)

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解如何实现中文命名实体识别研究,构建BiGRU-CRF模型实现。这篇文章将继续以中文语料为主,介绍融合Bert的实体识别研究,使用bert4keras和kears包来构建Bert+BiLSTM-CRF模型。然而,该代码最终结…

GPT模型部署后续:聊天机器人系统的扩展与优化

一、多轮对话支持 为了实现多轮对话支持,我们需要维护用户的会话上下文。这可以通过在服务器端使用一个字典来存储会话状态实现。 目录 一、多轮对话支持 下面是一个简单的扩展例子: 二、性能优化 三、用户界面与交互优化 下面是一个简单的HTML示例&…

如何使用Python进行网络安全与密码学【第149篇—密码学】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 用Python进行网络安全与密码学:技术实践指南 随着互联网的普及,网络…

SpringMVC 简介及入门级的快速搭建详细步骤

MVC 回顾 MVC,即Model-View-Controller(模型-视图-控制器)设计模式,是一种广泛应用于软件工程中,特别是Web应用开发中的架构模式。它将应用程序分为三个核心组件: Model(模型)&#…

论文阅读:Forget-Me-Not: Learning to Forget in Text-to-Image Diffusion Models

Forget-Me-Not: Learning to Forget in Text-to-Image Diffusion Models 论文链接 代码链接 这篇文章提出了Forget-Me-Not (FMN),用来消除文生图扩散模型中的特定内容。FMN的流程图如下: 可以看到,FMN的损失函数是最小化要消除的概念对应的…

福建科立讯通信 指挥调度管理平台 SQL注入漏洞复现(CVE-2024-2620、CVE-2024-2621)

0x01 产品简介 福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案,以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设备、维护人员和工作任…

java获取数据库信息为空解决方案

问题:1.可能的解决方法一2.可能的解决方法二3.可能的解决方法三4.可能的解决方法四5.可能的解决方法五(我自己问题的解决方案)总结 问题: 刚发现这个问题的时候还是在进行插入数据操作的时候,发现报错。 报错的原因是因…
最新文章