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

过於频繁访问服务器,会造成服务器负担,这时必须使用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('请求过於频繁,请一分钟後在试')

<<:  git - 2 ( push github、找插件、token、branch+merge、tag、stash )

>>:  D21. 学习基础C、C++语言

excel 内有病毒

想请问一下,公司用了本人一个 excel 档案已经几年了,一般也是自动化处理公司内部一些文件或报告类...

Day30 javascript 总结

今天是最後一天,咱们今天不看程序码,来谈谈现在我们已经学习了 JavaScript,做个总结顺便想想...

DAY6-EXCEL统计分析:计算连续型机率

上次学会了有关离散型的机率生活题 今天来说有关连续型的机率生活应用 NORMAL DISTRIBUT...

企划实现(19)

在写app时常常会因为所有app在外观看起来一样,所以往往会要找很久才能找到自己想要执行的app,所...

#11 CSS3 Flexbox: RWD

How do RWD control columns displaying on devices o...