需求及实现思路
需求:统计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'
]
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!