第七章中间件
Posted demiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第七章中间件相关的知识,希望对你有一定的参考价值。
第七章、中间件
一、什么是中间件
django 中间件 就类似于是 django 的门户,请求来的时候需要先经过 中间件 才能到达 django 后端(urls),响应走的时候也需要经过 中间件 才能到达 web服务网关接口(wsgif 模块)
二、中间件可以做什么
用户访问频率限制
用户是否是黑名单 白名单
所有用户登录校验
只要是涉及到网址全局的功能 你就应该考虑使用中间件
三、再回顾一下django请求生命周期
四、五个可以自定义的方法
需要掌握的:
process_request(******):请求来的时候 会从上往下依次经过每一个中间件里面process_request,一旦里面返回了HttpResponse对象那么就不再往后执行了 会执行同一级别的process_response
def process_request(self,request):
print('我是第一个自定义中间件里面的process_request方法')
return HttpResponse("我是第一个自定义中间件里面的HttpResponse对象返回值") # 直接原地返回
process_response(***):响应走的时候 会从下往上依次进过每一个中间件里面的process_response
def process_response(self,request,response): # response就是要返回给用户的数据
print("我是第一个自定义中间件里面的process_response方法")
return response
只要了解的
process_view:路由匹配成功之后执行视图函数之前触发
process_exception:当视图函数出现异常(bug)的时候自动触发
process_template_response:当视图函数执行完毕之后并且返回的对象中含有render方法的情况下才会触发
- 如果是
None
,则继续按照django定义的规则向后继续执行 - 如果是
HttpResponse
对象,则直接将该对象返回给用户。
process_request
请求来的时候会依次执行 settings.py 配置文件中注册了的中间件里的该方法
- 如果没有该方法则直接跳过,走下一个中间件
- 如果该方法里返回了 HttpResponse 对象,那么会直接从当前中间件的 process_response 方法 从下往上依次执行返回,不会再接着往下执行
- 执行顺序:从上往下
- 该方法可以实现对用户身份的校验,访问频率的限制,用户权限的校验...
基于该特点就可以做访问频率限制
process_response
响应走的时候会依次执行 settings.py 配置文件中注册了的中间件里的该方法(必须将 response 形参返回,因为这个 response 指代的就是返回给前端的数据)
- 如果没有该方法则直接跳过,走下一个中间件
- 执行顺序:从下往上
- 该方法可以帮你实现缓存机制(减缓服务器、数据库的压力)
需要了解的方法
process_view
路由匹配成功 执行视图函数之前 自动触发(从上往下依次执行)
process_exception
当视图函数报错了,自动触发(从下往上依次执行)
process_template_response
视图函数返回的 HttpResponse 对象中包含了 render 属性时会触发,或者是表明一个对象时 TemplateResponse 对象或等价方法 的时候也会触发(从下往上依次执行)
def index(request):
print("我是 index 视图函数")
def render():
return HttpRespone('用户最终能够看到的结果') # ******
obj = HttpResponse('index')
obj.render = render # 返回的 HttpResponse 对象中必须包含 render 属性,才能触发中间件里定义的 process_template_response 方法
return obj
强调:
在写中间件的时候,只要形参中有 response ,就要记得将其返回,这个Response 是要给前端的信息
以上是关于第七章中间件的主要内容,如果未能解决你的问题,请参考以下文章
六万字长文!让你懂透编译原理——第七章 语义分析和中间代码产生