一、定义限制访问频率的中间件
common/middleware.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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 :] |
二、将中间件加入配置文件
setting.py
1
2
3
4
5
6
7
8
9
10
|
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' , ] |
对使用 rest_framework 框架的项目来说,可以使用框架的设置来对api的访问频率进行限制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES' : ( 'rest_framework.parsers.JSONParser' , 'rest_framework.parsers.FormParser' , 'rest_framework.parsers.MultiPartParser' , ), 'DEFAULT_AUTHENTICATION_CLASSES' : ( # 'lecare.core.rest_auth.CrossSiteSessionAuthentication', ), 'DEFAULT_PERMISSION_CLASSES' : [ # 'rest_framework.permissions.IsAuthenticated', 'rest_framework.permissions.AllowAny' , ], 'PAGE_SIZE' : 20 , 'UNICODE_JSON' : False , # 'COERCE_DECIMAL_TO_STRING': False, # 'EXCEPTION_HANDLER': 'lecare.core.custom_exception_handler.custom_exception_handler', 'JWT_EXPIRATION_DELTA' : datetime.timedelta(hours = 2 ), 'JWT_REFRESH_EXPIRATION_DELTA' : datetime.timedelta(days = 360 ), 'JWT_ALLOW_REFRESH' : False , 'JWT_AUTH_HEADER_PREFIX' : 'JWT' , 'JWT_PAYLOAD_HANDLER' : 'consumer.jwt_conf.jwt_payload_handler' , 'JWT_RESPONSE_PAYLOAD_HANDLER' : 'consumer.jwt_conf.jwt_response_payload_handler' , 'JWT_GET_USER_SECRET_KEY' : 'consumer.jwt_conf.jwt_get_secret_key' , # 'DEFAULT_THROTTLE_CLASSES': ( # # 开启匿名用户接口请求频率限制 # 'rest_framework.throttling.AnonRateThrottle', # # 开启授权用户接口请求频率限制 # 'rest_framework.throttling.UserRateThrottle' # ), # 'DEFAULT_THROTTLE_RATES': { # # 频率限制有second, minute, hour, day # # 匿名用户请求频率 # 'anon': '30/second', # # 授权用户请求频率 # 'user': '30/second' # } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://segmentfault.com/a/1190000016114237