• 定义中间件,在中间件中响应走的时候判断该请求的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": "",						# 设置密码
    
  • 定义中间件
  • from django.utils.deprecation import MiddlewareMixin
    from celery_task.tasks import get_api_throttling
    # 统计接口访问次数的中间件
    class APIThrottlingMiddleware(MiddlewareMixin):
        def process_response(self, request, response):
            if response.status_code != 404:			# 只统计存在的接口
                this_url = request.path
                get_api_throttling.delay(this_url)		# 响应走的时候调用异步任务,更新接口调用次数
            return response
    
  • 实现celery异步任务【包管理的方式】
  • # celery_task/tasks.py
    from .celery import app
    from Luffyapi.utils.get_redis_obj import conn		
    # 使用django-redis.get_redis_connection的方式操作原生的redis
    @app.task
    def get_api_throttling(url):
        # cache_api_throttling_info_hash是一个hash结构,url作为key; url存在则加1,不存在则新增一个默认值=1
        conn.hincrby('cache_api_throttling_info_hash', url, amount=1)		
        return True
    
  • 通过命令开启celery的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