Django—限制用戶訪問頻率

django中間件

1、定義限制訪問頻率的中間件

  • common/middleware.py
import time

from django.utils.deprecation import MiddlewareMixin

MAX_REQUEST_PER_SECOND=2 #每秒訪問次數

class RequestBlockingMiddleware(MiddlewareMixin):

    def process_request(self,request):
        now=time.time()
        request_queue = request.session.get('request_queue',[])
        if len(request_queue) < MAX_REQUEST_PER_SECOND:
            request_queue.append(now)
            request.session['request_queue']=request_queue
        else:
            time0=request_queue[0]
            if (now-time0)<1:
                time.sleep(5)

            request_queue.append(time.time())
            request.session['request_queue']=request_queue[1:]

2、將中間件加入配置文件

  • setting.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'common.middleware.RequestBlockingMiddleware', #在sessions以後,auth以前
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]12345678910

drf的throttle設置api的訪問速率

做用:防止爬蟲無節制的爬取數據 減小服務器的壓力。
drf的自帶功能

官方文檔:http://www.django-rest-framew...django

1、throttle配置到setting中api

'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day'
    }
限速規則與限速的類。未登陸狀況下限速,經過ip地址。登陸狀況下經過session或token來判斷。
The rate descriptions used in DEFAULT_THROTTLE_RATES may include second, minute, hour or day as the throttle period.

2、設置到咱們的接口緩存

from rest_framework.throttling import UserRateThrottle,AnonRateThrottle

throttle_classes = (UserRateThrottle, AnonRateThrottle)

在throttling的源碼中服務器

parse_rate:進行解析咱們的規則
allow_request:中使用django的cache進行緩存。將每一個ip的訪問次數設置到緩存中
get_ident:會經過 request.meta.get('remote_addr')取出ip
已登陸用戶的限制是經過 request.user.pk
相關文章
相關標籤/搜索