Django 中介軟體實現使用者認證與IP頻率限制

Yven發表於2018-11-23

1.URL訪問過濾

通過裝飾器進行使用者認證非常方便,但是在新增部分需要認證的功能時,就需要再次新增裝飾器,如果通過中介軟體來實現,就不需要再進行新增的操作.

import re
LOGIN_URL = `/login/`
class MyLogin(MiddlewareMixin):
    def process_request(self, request):
        # 獲取當前頁面的路由
        url = request.get_full_path()
        path = request.path
        print(path)
        # 通過session判斷是否登入
        is_login = request.session.get(`is_login`)
        # 判斷當前頁面是否是login頁面
        if not re.match(path, LOGIN_URL):
            if not is_login:
                # 如果沒有登入,重定向到login頁面
                return redirect(`/login/?next=%s` % url)

    def process_response(self, request, response):
        return response

2.做IP訪問頻率限制

為了防止某些IP惡意高頻訪問伺服器,可以對這些IP進行限制,進行攔截.

import time
class OverTime(MiddlewareMixin):
    def process_request(self, request):
        # 獲取客戶端IP地址
        IP = request.META.get(`REMOTE_ADDR`)
        # 獲取該IP地址的值,如果沒有,給一個預設列表[]
        lis = request.session.get(IP, [])
        # 獲取當前時間
        curr_time = time.time()
        # 判斷操作次數是否小於3次
        if len(lis) < 3:
            # 如果小於3次,新增本次操作時間
            lis.append(curr_time)
            # 儲存
            request.session[IP] = lis
        else:
            # 如果本次操作時間減去第一次操作時間小於60秒,則不讓其繼續操作
            if time.time() - lis[0] < 60:
                return HttpResponse(`操作過於頻繁`)
            else:
                # 如果大於60秒則交叉複製
                lis[0], lis[1], lis[2] = lis[1], lis[2], time.time()
                # 儲存
                request.session[IP] = lis

    def process_response(self, request, response):
        return response

相關文章