27Django用中间件实限制某个ip地址只能向 /test开头的地址发送5次请求

题目:

用中间件实现强制某个ip地址只能向 /test开头的地址发送5次请求

提示:

request.META['REMOTE_ADDR']可以得到远程客户端的ip地址

request.path_info可以得到客户端访问的请求路由信息

分析:

本例需求适合使用下面的这个中间件方法:

process_request(self, request)
    执行路由之前被调用,在每个请求上调用,返回None或HttpResponse对象,适用于ip地址的过滤

开工:

1在项目目录下创建一个python包:middleware,并在python包middleware中创建一个python文件mymiddleware.py(右键mysite7 -- New -- python Package):

mysite7
    middleware
       __init__.py
       mymiddleware.py
    mysite7
        __init__.py
        asgi.py
        settings.py
        urls.py
        views.py
        wsgi.py
    manage.py

2在mymiddleware.py内编写中间件:

#用中间件实限制某个ip地址只能向 /test开头的地址发送5次请求
class VisitLimit(MiddlewareMixin):
    visit_times = {}
    def process_request(self,request):
        #获取访问者的ip
        ip_address = request.META['REMOTE_ADDR']
        #获取访问者的路由
        path_url = request.path_info
        #如果不是/test开头的路由就直接retuen None,往下继续进行
        if not re.match('^/test',path_url):
            return
        #从字典里获取ip地址,如果字典为空就给这个ip的value值设置一个0
        times = self.visit_times.get(ip_address,0)
        print('ip',ip_address,'已经访问',times)
        #每访问一次就让visit_times[ip_address]的值加1
        self.visit_times[ip_address] = times + 1
        #如果值小于五就放行
        if times < 5:
            return
        return HttpResponse('您访问了' + str(times) + '次,访问被禁止')

 

3注册中间件

MIDDLEWARE = [
    'middleware.mymiddleware.VisitLimit',
]

 4访问浏览器http://127.0.0.1:8000/test_cache

您访问了13次,访问被禁止

 

 

posted @ 2021-12-07 14:17  linuxTang  阅读(120)  评论(0)    收藏  举报