Others(二)AOP

AOP面向切面编程AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP主要体现在中间件
 
-OOPAOP
OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。
AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
 
一、中间件
-官方解释:
中间件(Middleware)是一个镶嵌到djangorequest/response处理机制中的一个钩子(hooks) 框架。它是一个可以修改django全局输入或输出的一个底层插件系统。
 
Django最初接收的HttpRequest对象,而不是request对象,正是中间件的作用HttpRequest对象和user对象打包成了一个全局变量request对象,这样才可以View中使用request作为变量或者在模板中随意调用request.user
中间件在整个Django的request/response处理机制中的角色如下所示:
HttpRequest -> Middleware -> request -> View -> response -> Middleware -> HttpResponse
 
二、中间件的执行顺序
settings.py注册中间件时一定要要考虑中间件的执行顺序,中间件在request到达view之前是从上向下执行的,在view执行完后返回reponse过程中是从下向上执行
 
三、Django中的内置中间件
1.各中间件的含义:
-SecurityMiddleware:为request/response提供了几种安全改进,无它不安全
-SessionMiddleware:开启session会话支持,无它无session
-CommonMiddleware:基于APPEND_SLASH和PREPEND_WWW的设置来重写URL,如果APPEND_SLASH设为True,并且初始URL 没有以斜线结尾以及在URLconf 中没找到对应定义,这时形成一个斜线结尾的新URL;如果PREPEND_WWW设为True,前面缺少 www的url将会被重定向到相同但是以一个www开头的url。
-CsrfViewMiddleware:添加跨站点请求伪造的保护,通过向POST表单添加一个隐藏的表单字段,并检查请求中是否有正确的值,无它无csrf保护
-AuthenticationMiddleware:在视图函数执行前向每个接收到的user对象添加HttpRequest属性,表示当前登录的用户,无它用不了request.user
-MessageMiddleware:开启基于Cookie和会话的消息支持,无它无message
-XFrameOptionsMiddleware:对点击劫持的保护
 
2.如果你要实现全站缓存, 还需要使用UpdateCacheMiddlewareFetchFromCacheMiddleware,但一定要注意它们的顺序,Update在前和Fetch在后。
除此以外Django还提供了压缩网站内容的GZipMiddleware根据用户请求语言返回不同内容的LocaleMiddleware和给GET请求附加条件的ConditionalGetMiddleware这些中间件都是可选的
 
*四、自定义中间件
1.先创建中间件文件夹。然后在settings.py中注册,如第一张图所示
2.编写特定的功能函数
-常用于实现权限校验,限制用户请求、打印日志、改变输出内容等多种应用场景,比如:
1.禁止特定IP地址(封IP的用户或未登录(禁止游客访问)的用户访问我们的View视图函数
2.对同一IP地址单位时间内发送的请求数量做出限制(频率限制、反爬虫)
3.在View视图函数执行记录用户的IP地址(统计)
4.在View视图函数执行传递额外的变量或参数
5.在View视图函数执行或执行特定信息打印到log日志
6.在View视图函数执行后对reponse数据进行修改后返回给用户
 
-中间件的切点
process_request
process_view
process_template_response
process_response
process_exeption
 
 
 
-频率控制算法
算法描述:限制60秒内最多查询10
 
*算法思路:
1.首先,设置一个每次查询操作的时间戳列表到缓存。
2.然后获取当前时间戳now = time.time()。用now和列表中最后一个时间戳作比较,若超过60秒,则将最后一个时间戳从列表中pop()出。
3.接着判断列表的长度是否超过10。若超过,不再执行插入列表操作insert(0, now)设置缓存(过期时间60秒)
 
*算法实现:
 

猜你喜欢

转载自www.cnblogs.com/xiaoqichaoren/p/12942154.html