#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""__title__ = ''
__author__ = ''
__mtime__ = ''
"""import logging
import time
from rest_framework.throttling import ******ratethrottle
logger = logging.getlogger(
'mylogger'
)class
visitthrottlemixin
(object):
''' 根據django-rest-framework的限流原理改寫,根據滾動時間分片限流,應對瞬時高併發
有一定的侷限性
'''# 60s內可以訪問最大次數
max_capacity =
1# 設定超時時間
time_delta =
60def
__init__
(self)
:# 用於await計算剩餘訪問時間
self.history =
none
self.__visit_key =
'__visit_throttle_key'
defallow_request
(self, request, view)
: mehtod = request.method
uri_name = request.path_info
if mehtod ==
"post"
and uri_name ==
"/***/***/"
: ctime = time.time(
)# 使用者第一次訪問,將其進行記錄,並且返回true,允許繼續訪問
if self.__visit_key not
in request.session:
request.session[self.__visit_key]
=[ctime,
]return
true
# 如果不是第一次訪問,獲取所有的記錄在
history = request.session.get(self.__visit_key)
self.history = history
# 如果有歷史訪問記錄,並且最早一次的訪問記錄離當前時間超過60s,就刪除最早的那個訪問記錄,
# 只要為true,就一直迴圈超過60s就刪除最早的一次訪問記錄
while history and history[-1
]<
(ctime - self.time_delta)
: history.pop(
)# 如果訪問記錄不超過max_capaciry次,就把當前的訪問記錄插到第乙個位置(pop刪除最後乙個)
iflen
(history)
< self.max_capacity:
history.insert(
0, ctime)
request.session[self.__visit_key]
= history
return
true
return
false
else
:return
true
defwait
(self)
:'''還需要等多久才能訪問'''
ctime = time.time(
)return self.time_delta -
(ctime - self.history[-1
])visit_record =
# 定義全域性變數,用於存放訪問記錄
class
visitthrottle
(object):
# 60s內可以訪問最大次數
max_capacity =
1# 設定超時時間
time_delta =
60def
__init__
(self)
:# 用於await計算剩餘訪問時間
self.history =
none
defallow_request
(self, request, view)
:# 獲取使用者ip作為唯一的標示
)# 獲取當前訪問的時刻
ctime = time.time(
)# 這是使用者第一次訪問,將其進行記錄,並且返回true,允許繼續訪問
if remote_addr not
in visit_record:
visit_record[remote_addr]
=[ctime,
]return
true
# 如果不是第一次訪問,獲取所有的記錄
history = visit_record.get(remote_addr)
self.history = history
# 判斷最開始的時刻與現在的時刻的差值是否在規定的時間範圍內,比如在60s內,如果不在,
# 可以去除最開始的時刻記錄
while history and history[-1
]< ctime - self.time_delta:
history.pop(
)# 此時列表中的時刻記錄都是在規定的時間範圍內,判斷時刻的個數也就是訪問的次數
iflen
(history)
< self.max_capacity:
history.insert(
0, ctime)
return
true
defwait
(self)
:# 還需要等多少秒才能訪問
ctime = time.time(
)return self.time_delta -
(ctime - self.history[-1
])
webpack中的載入器使用
在實際開發過程中,webpack預設只能打包處理以.js字尾名結尾的模組。其他非.js字尾名結尾的模組,webpack預設是處理不了的,這時候需要呼叫loader載入器才可以正常打包,否則會報錯。1 打包處理css檔案 1 執行npm i style loader css loader d命令,安裝...
使用Redis進行限流
通過使用註解 提供介面形式與引數形式2種方式 針對性的對介面進行限流,底層使用redis配合lua指令碼實現令牌桶。public class redisratelimiter public boolean tryacquire string flag,int maxpermits,int addra...
使用Nginx實現限流
1.http限流配置 限制請求 請求單個ip,每秒讀50次,寫10次 limit req zone uri zone api read 20m rate 50r s 讀 limit req zone uri zone api write 20m rate 10r s 寫 按ip配置乙個連線 zone...