iT邦幫忙

0

django新手村12-----黑名單

  • 分享至 

  • xImage
  •  

過於頻繁訪問伺服器,會造成伺服器負擔,這時必須使用middleware來阻擋,在尚未訪問到資料前,就阻擋

創建一個資料夾middleware與app同級

middleware底下創建mymiddleware.py

mymiddleware.py

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


class MyMiddleware(MiddlewareMixin):

    def process_request(self, request):

        ip = request.META.get('REMOTE_ADDR')

        if request.path == '/app/test/':

            result = cache.get(ip)

            if result:
                return HttpResponse('請10秒後在試')
            cache.set(ip, ip, timeout=10)

setting.py註冊自訂的middleware

MIDDLEWARE = [
    'middleware.mymiddleware.MyMiddleware',

單純的靜態網頁比較不需要什麼加載時間,對伺服器消耗也較少,但是如果試搜尋可能消耗就會比較多

def process_request(self, request):是固定用法

request.META打印出來會是許多關於網頁的資訊,像是'REMOTE_ADDR',CONTENT_TYPE,user-agent...

request.path要的是需要添加黑名單的網址(不是所有網頁都需要黑名單),也就是127.0.0.1:8000後面的那串

那更好的方法是一分鐘不能訪問超過n次,因為使用者總是會覺得加載速度很慢,就一直刷新

一開始先確定該ip是否有來訪問過
沒有就為該ip建一個陣列,來存取時間(time.time())
有就使用快取上紀錄ip的arr,
當現在時間減去陣列中的時間,大於60就會將陣列的值pop出來

        if request.path == '/app/test/':
            arr = []

            if cache.get(ip):
                arr = cache.get(ip)

            while arr and time.time()-arr[-1] > 60:
                arr.pop()

            arr.append(time.time())
            cache.set(ip, arr, timeout=60)

            print(arr)
            if len(arr) > 10:
                return HttpResponse('請求過於頻繁,請一分鐘後在試')

在新增一些東西就變成黑名單啦

一開始不知道是否有黑名單在快取中,所以要先創建一個black_list,如果有就用原有的black_list

if len(arr) > 20:
black_list.append(ip)
cache.set('black_list', black_list, timeout=60*10)
如果已經告知"請求過於頻繁,請一分鐘後在試",還是繼續訪問,就會將該ip添加到黑名單中

        if request.path == '/app/test/':

            black_list = []

            if cache.get('black_list'):
                black_list = cache.get('black_list')

            if ip in black_list:
                return HttpResponse('10分鐘禁止訪問')

            arr = []

            if cache.get(ip):
                arr = cache.get(ip)

            while arr and time.time()-arr[-1] > 60:
                arr.pop()

            arr.append(time.time())
            cache.set(ip, arr, timeout=60)

            if len(arr) > 20:
                black_list.append(ip)
                cache.set('black_list', black_list, timeout=60*10)

            print(arr)
            if len(arr) > 10:
                return HttpResponse('請求過於頻繁,請一分鐘後在試')

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言