如何设置Django中针对特定IP的请求次数限制?
- 内容介绍
- 文章标签
- 相关推荐
本文共计617个文字,预计阅读时间需要3分钟。
学习笔记,仅供参考,有误请纠正。本Blog中,我们将使用中间件,限制特定IP地址只能向特定地址发起3次GET请求。在实现此功能前,我们需要先了解两个request的属性:限制IP请求次数和限制请求频率。
学习笔记,仅供参考,有错必纠
限制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',
]
向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次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次向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
本文共计617个文字,预计阅读时间需要3分钟。
学习笔记,仅供参考,有误请纠正。本Blog中,我们将使用中间件,限制特定IP地址只能向特定地址发起3次GET请求。在实现此功能前,我们需要先了解两个request的属性:限制IP请求次数和限制请求频率。
学习笔记,仅供参考,有错必纠
限制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',
]
向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次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次向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

