标签:dep rem shortcut pytho 限制 span 装饰器 ddr pop
一个轻量级,底层的插件,可以介入Django的请求和响应过程(面向切面编程),本质上就是一个Python类
面向切面编程(Aspect Oriented Programming)简称AOP。AOP的主要实现目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合的隔离效果
在不修改原有代码的情况下,动态注入一部分代码,类似于装饰器函数
process_request(self,request)
在执行视图函数前被调用
每个请求上都会调用,不主动进行返回或返回HttpResponse对象
process_view(self,request,view_func,view_args,view_kwargs)
调用视图函数之前执行
每个请求都会调用,不主动进行返回或返回HttpResponse对象
process_template_response(self,request,response)
在视图函数刚好执行完后进行调用
每个请求都会调用,不主动进行返回或返回HttpResponse对象
process_response(self,request,response)
所有响应返回浏览器之前调用
每个请求都会调用,不主动进行返回或返回HttpResponse对象
process_exception(self, request, exception)
当视图函数抛出异常时调用,不主动进行返回huo返回HttpResponse对象
middleware
from django.utils.deprecation import MiddlewareMixin
在settings中进行配置,在 MIDDLEWARE中添加,
middleware.文件名.类名
如果我们逻辑中没有返回值,那么程序执行的时候会按照原有逻辑执行
如果我们做出了返回,那么程序将会从切点处切开,直接回到浏览器
import time from django.core.cache import cache from django.http import HttpResponse from django.shortcuts import redirect from django.urls import reverse from django.utils.deprecation import MiddlewareMixin class HelloMiddle(MiddlewareMixin): def process_request(self, request): ip = request.META.get("REMOTE_ADDR") result = cache.get(ip) if result: return HttpResponse("您的访问过于频繁,请10秒之后再次搜索") cache.set(ip, ip, timeout=10)
import time from django.core.cache import cache from django.http import HttpResponse from django.shortcuts import redirect from django.urls import reverse from django.utils.deprecation import MiddlewareMixin class HelloMiddle(MiddlewareMixin): def process_request(self, request): ip = request.META.get("REMOTE_ADDR") black_list = cache.get(‘black‘,[]) requests = cache.get(ip, []) while requests and time.time() - requests[-1] > 60: # 如果requests存在,并且当前时间比列表中最后一个时间大60,则弹出最后一个。(最新的数据从头部插入) requests.pop() if len(requests) > 10: # 如果访问大于十次 return HttpResponse(‘请求过于频繁‘) requests.insert(0,time.time()) cahe.set(ip, request, timeout=60)
import time from django.core.cache import cache from django.http import HttpResponse from django.shortcuts import redirect from django.urls import reverse from django.utils.deprecation import MiddlewareMixin class HelloMiddle(MiddlewareMixin): def process_request(self, request): ip = request.META.get("REMOTE_ADDR") black_list = cache.get(‘black‘,[]) if ip in black_list: return HttpResponse("黑名单用户,凉凉") requests = cache.get(ip, []) while requests and time.time() - requests[-1] > 60: # 如果requests存在,并且当前时间比列表中最后一个时间大60,则弹出最后一个。(最新的数据从头部插入) requests.pop() requests.insert(0,time.time()) cahe.set(ip, requests, timeout=60) if len(requests) > 30: black_list.append(ip) cache.set(‘black‘, black_list, timeout=60*60*24) return HttpResponse("小爬虫小黑屋里呆着吧") if len(requests) > 10: # 如果访问大于十次 return HttpResponse(‘请求过于频繁‘)
中间件的配置顺序特别重要,请求按照中间件的配置顺序执行,响应按照中间件的倒序执行。
标签:dep rem shortcut pytho 限制 span 装饰器 ddr pop
原文地址:https://www.cnblogs.com/huiyichanmian/p/12215681.html