django 사용자 정의 중간부품 접근 주파수 제한 및 IP 비활성화
12760 단어 django
4
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
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',
]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.