django 사용자 정의 중간부품 접근 주파수 제한 및 IP 비활성화

12760 단어 django
Http 요청은 무상태이기 때문에 서비스 측은 그 클라이언트의 방문을 직접 알 수 있기 때문에 우리는session 기술을 이용하여 모든 사용자가 방문한 상태 데이터를 기억할 수 있다.
4
  • 사용자가 요청을 한 후에 사용자의 IP를 기록하고 매번 방문 시간의 통계를 작성하여 클라이언트의 방문 빈도 제한을 실현하고 IP가 금지한다
  • import time
    from django.http import HttpResponse
    
    # Create your views here.
    VISIT_LIMIT = 20
    TIME_INTERVAL = 10
    RETRY_TIME = 10
    IP_BLACKLIST = ["192.168.1.2", "127.0.0.1"]
    
    class LimitMiddleware:
        def __init__(self, get_response):
            self.get_response = get_response
            # One-time configuration and initialization.
    
        def __call__(self, request):
            #      (url   )  
            # Code to be executed for each request before
            # the view (and later middleware) are called.
    
            now = time.time()
            print("     (url   )  ",now)
            request_queue = request.session.get("request_queue", [])
            request_limit = request.session.get("request_limit", 0)
            remot_addr = request.META.get("REMOTE_ADDR", "")
    
            #     IP     ,        
            if remot_addr in IP_BLACKLIST:
                return HttpResponse("  IP    ,         ")
    
            #        ,     
            if request_limit:
                time.sleep(1)
                visit_limit =  now - request.session["request_queue"][-1]
    
                if visit_limit >= request_limit:
                    request_limit = 0
                    visit_limit = 0
                    request.session["request_limit"] = request_limit
                    request.session["request_queue"] = []
    
                return HttpResponse("%d    "%(request_limit - visit_limit))
    
            if request_queue == []:
                request_queue.append(now)
                request.session["request_queue"] = request_queue
            else:
                request_queue.append(now)
                request.session["request_queue"] = request_queue
    
            # TIME_INTERVAL      VISIT_LIMIT ,         
            if len(request_queue) >= VISIT_LIMIT:
                if request_queue[0] - request_queue[-1] <= TIME_INTERVAL:
                    request.session["request_limit"] = RETRY_TIME
                    return HttpResponse("    ,%d    "%(RETRY_TIME))
                else:
                    request_queue = []
                    request.session["request_queue"] =  request_queue
    
    
            response = self.get_response(request)
            #        ,           
            # Code to be executed for each request/response after
            # the view is called.
    
            return response
    
        # url            
        def process_view(request, view_func, *view_args, **view_kwargs):
            print("     :process_view")
            # return HttpResponse("        ")
    
        def process_exception(request, exception, *args):
            print("      ....",*args)
            return HttpResponse("      ....%")
    
    
    
    
    

    4
  • settings를 설정하는 것은session 기술을 사용하기 위해서이다. 그러므로 우리는 자신이 쓴 중간부품을django의session 중간부품 뒤에,auth 이전에4
  • MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        "frequencylimit.frequencylimitmiddleware.LimitMiddleware",
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    

    좋은 웹페이지 즐겨찾기