1. 程式人生 > 實用技巧 >Django18-中介軟體和cache實現限制使用者訪問頻率

Django18-中介軟體和cache實現限制使用者訪問頻率

需求:

同一個源ip訪問web時,判斷該ip訪問的頻率,如果1分鐘內訪問次數超過10次,則鎖定1分鐘,1分鐘後可以再次訪問

通過中介軟體和cache來實現,在中介軟體process_request中獲取使用者的客戶端ip,將ip新增到cache中,以該ip為key,時間戳列表為value,{ ip, [] }

from django.core.cache import cache
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin

import time

'''
限制使用者登入頻率,1分鐘內最多登入10次
''' class LoginTimesMiddle(MiddlewareMixin): def process_request(self, request): # ip = request.META.get('REMOTE_ADDR') ip = request.META.get('REMOTE_ADDR') print(ip) # 從cache中獲取這個ip每次登入的時間戳列表 req = cache.get(ip, []) print(req) # if req:
# # 時間戳從後往前排,最新的時間戳放在最前面,如果使用者登入時間與列表中最早的時間差大於1分鐘,則刪除最早的時間戳 # while time.time() - req[-1] > 60: # req.pop() while req and time.time() - req[-1] > 60: req.pop() # 每次登入都將當前時間戳插入到cache中的ip列表最前面儲存,並設定超時時間60秒 req.insert(0, time.time()) cache.set(ip, req, timeout
=60) if len(req) > 10: return HttpResponse('請求次數過於頻繁,請1分鐘後嘗試')

如果1分鐘內訪問次數超過30分鐘,則將該源ip加入黑名單中,24小時內限制訪問

from django.core.cache import cache
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin

import time

'''
限制使用者登入頻率,1分鐘內最多登入10次
'''


class LoginTimesMiddle(MiddlewareMixin):
    def process_request(self, request):
        # ip = request.META.get('REMOTE_ADDR')
        ip = request.META.get('REMOTE_ADDR')
        print(ip)

        # 從cache中獲取這個ip每次登入的時間戳列表
        req = cache.get(ip, [])
        print(req)
blacklist_ip
= cache.get('blacklist',[]) if ip in blacklist_ip: return HttpResponse('ip在黑名單中,禁止訪問') # if req: # # 時間戳從後往前排,最新的時間戳放在最前面,如果使用者登入時間與列表中最早的時間差大於1分鐘,則刪除最早的時間戳 # while time.time() - req[-1] > 60: # req.pop() while req and time.time() - req[-1] > 60: req.pop() # 每次登入都將當前時間戳插入到cache中的ip列表最前面儲存,並設定超時時間60秒 req.insert(0, time.time()) cache.set(ip, req, timeout=60) if len(req) >= 30: #如果1分鐘內訪問次數超過30次,則將ip加入黑名單中,24小時內禁止登入 blacklist_ip.append(ip) cache.set('blacklist',blacklist_ip,timeout=60*60*24) return HttpResponse('訪問過於頻繁,ip被加入黑名單中') if len(req) > 10: return HttpResponse('請求次數過於頻繁,請1分鐘後嘗試')

注意settings.py中需要註冊中介軟體

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'devops.middleware.LoginTimesMiddle',
]