学习笔记,仅供参考,有错必纠


限制IP请求次数



这个Blog中,我们将使用中间件,实现强制某个IP地址只能向某个地址发送3次GET请求。

在做这个案例之前我们需要先学两个request的属性:

  • ​request.META['REMOTE_ADDR']​​ ,得到远程客户端的IP地址
  • ​request.path_info​​ ,得到客户端GET请求的路由信息


现在,我们在主urls.py中创建路由:

urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^testlimit/$',views.test_limit),
]

在主视图模块中增加视图函数:

def test_limit(request):
return HttpResponse("我是测试页面... ...")

创建自动以中间键:

class VisitLimit(MiddlewareMixin):
'''此中间件限制一个IP地址对应的访问/testlimit/的次数不能改过3次,超过后禁止使用'''
visit_times = {}
# 此字典用于记录客户端IP地址有访问次数
def process_request(self, request):
ip_address = request.META['REMOTE_ADDR'] # 得到IP地址
if not re.match('^/testlimit/$', request.path_info):
return None
#继续请求
times = self.visit_times.get(ip_address, 0)
print("IP:", ip_address, '已经访问过', times, '次!:', request.path_info)
self.visit_times[ip_address] = times + 1
if times < 3:
return None

return HttpResponse('你已经访问过' + str(times) + '次,禁止再次访问!')

将我们刚创建的中间键进行注册:

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'mymiddleware.checklogin.MyMiddleWare',
'mymiddleware.checklogin.VisitLimit',
]

向http://127.0.0.1:8000/testlimit/发起请求:

Django(part42)--限制IP请求次数_python

查看cmd界面:

IP: 127.0.0.1 已经访问过 0 次!: /testlimit/
[24/Jun/2020 01:28:57] "GET /testlimit/ HTTP/1.1" 200 25

再访问2次http://127.0.0.1:8000/testlimit/,并查看cmd界面:

IP: 127.0.0.1 已经访问过 1 次!: /testlimit/
[24/Jun/2020 01:30:40] "GET /testlimit/ HTTP/1.1" 200 25
IP: 127.0.0.1 已经访问过 2 次!: /testlimit/
[24/Jun/2020 01:30:53] "GET /testlimit/ HTTP/1.1" 200 25

当我们第4次向http://127.0.0.1:8000/testlimit/发起请求时,出现如下页面:

Django(part42)--限制IP请求次数_ip地址_02

再查看cmd界面:

IP: 127.0.0.1 已经访问过 3 次!: /testlimit/
[24/Jun/2020 01:31:35] "GET /testlimit/ HTTP/1.1" 200 46