需求及实现思路

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

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

具体思路:

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

[ Django ] 统计接口访问频次-LMLPHP

代码实现

  • 配置缓存
# 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'
]

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

[ Django ] 统计接口访问频次-LMLPHP

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

[ Django ] 统计接口访问频次-LMLPHP

03-22 09:18