中间件

作者: 互联网中的一个咸鱼 | 来源:发表于2019-09-25 21:26 被阅读0次

    官方文档-中间件指南

    中间件的作用就是可以拦截请求和响应

    就是可以在调用视图前和在调用视图后,做一些其他事情。

    自定义中间件

    方式一

    适用于 Django2.x

    from django.shortcuts import HttpResponse
    
    class RejectIpMiddleware:
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            remote_ip = request.META['REMOTE_ADDR']
            print(f"接收到请求后 --> 我在这里呀{remote_ip}--》调用视图前")
            # return HttpResponse(f"{request.META['REMOTE_ADDR']}")
            response = self.get_response(request)
            print("调用视图后--》我在这里呀--》返回页面前")
            return response
    
    

    方式二

    兼容 Django1.1

    from django.shortcuts import HttpResponse
    
    from django.utils.deprecation import MiddlewareMixin
    
    class RejectIpMiddlewareMixin(MiddlewareMixin):
        def __init__(self, get_response):
            self.get_response = get_response
    
        def process_request(self, request):
            print("接收到请求后 --> 我在这里呀--》调用视图前")
    
        def process_response(self, request, response):
            print("调用视图后--》我在这里呀--》返回页面前")
            return response
    
    

    示例:几秒几次

    1. 中间件代码

    import time
    from django.shortcuts import HttpResponse
    
    # 时间范围 3 秒
    REJ_SECOND = 3
    
    # 限定访问次数
    REJ_LIMIT = 10
    
    # 封闭时长
    REJ_TIME = 60
    
    # IP 列表
    REJ_IP = {}
    info = {
        'count': '3 秒内范围的次数',
        'access_time': '访问时间',
        'rejected': '拒绝时长',
    }
    
    def reject_ip(ip):
        if ip not in  REJ_IP:
            REJ_IP[ip] = {
                'count': 1,
                'access_time': int(time.time()),
                'rejected': None
                }
            return None
        # 程序走到这里时,增加访问次数 1 次
        REJ_IP[ip]['count'] += 1
    
        # 判断是否在 3 秒之内
        if time.time() < REJ_IP[ip]['access_time'] + 3:
                # 判断访问次数合法
                if REJ_IP[ip]['count'] > REJ_LIMIT:
                    REJ_IP[ip]["rejected"] = int(time.time())
                    print("访问次数首次超限:",REJ_IP[ip]['count'])
                    return True
                print("有了:",REJ_IP)
    
        # 程序走的这里是 3 秒之外
        else:
                print("目的访问次数:",REJ_IP[ip]['count'])
                rejected = REJ_IP[ip]["rejected"]
                if rejected and time.time() < REJ_IP[ip]["rejected"] + REJ_TIME:
                    print("访问信息",REJ_IP[ip] )
                    return True
                else:
                    # 3 秒之外了,并且没有被封,或者超出解禁时间范围的,
                    #  次数和时间都应该重新计算
                    print("来了兄弟", REJ_IP, int(time.time()))
                    __tmp_d = {'count': 1,
                               'rejected': None,
                               'access_time': int(time.time())}
                    REJ_IP[ip].update(__tmp_d)
                    print("改过了", REJ_IP)
    
    

    2. 应用中间件

    中间件可以是任意的 .py 文件,可以放在项目任何可被导入的路径中。

    比如可以把中间件放在

    project_roo/MyMiddleware/rejectip.py 文件中

    接下来在 settings.py 中设置一下,注意位置

    image.png

    相关文章

      网友评论

          本文标题:中间件

          本文链接:https://www.haomeiwen.com/subject/gqiwuctx.html