学习笔记,仅供参考,有错必纠
限制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/发起请求:
查看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/发起请求时,出现如下页面:
再查看cmd界面:
IP: 127.0.0.1 已经访问过 3 次!: /testlimit/
[24/Jun/2020 01:31:35] "GET /testlimit/ HTTP/1.1" 200 46