Django中间件执行流程
中间件函数是 django 框架为我们预留的函数接口, 让我们可以干预请求和应答的过程
1. 获取浏览器端的IP地址:
使用 request.META[‘REMOTE_ADDR’]
2. 使用中间件
1. 创建中间件:
新建 middlewere.py 的文件
from django.htto import HttpResponse
class BlockIPSMiddleware(object):
"""中间件类"""
EXCLUDE_IPS = ['127.0.0.1']
# django 为我们预留的函数
def process_view(request, view_func, *args, **kwargs):
"""
中间件函数
视图函数调用之前会调用它
"""
user_ip = request.META['REMOTE_ADDR']
if user_ip in BlockIPSMiddleware. EXCLUDE_IPS:
return HttpResponse("禁止使用!")
2. 注册中间件:
# 注册中间件
MIDDLEWARE_CLASSES = [
'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',
'myapp.middleware.BlockIPSMiddleware' # 注册中间件类
]
3. 流程:


- 浏览器发送请求
- Django网站, 产生 request 对象
- 调用中间件类中的 process_request
- url 的匹配(通过 URL 找对应的视图)
- 调用中间件类中的 process_view
- 调用我们自己的视图 view
- 调用中间件类中的 process_response
- process_response 将响应内容 返回给浏览器
4. 在类中定义中间件预留函数:
__init__: 服务器相应第一个请求的时候调用- process_request: 是在产生 request 对象, 进行 url 匹配之前调用
- process_view: 是 url 匹配之后, 调用视图函数之前调用
- process_response: 视图函数调用之后, 内容返回给浏览器之前调用
- process_exception: 视图函数调用之后, 内容返回给浏览器之前
- 如果注册的多个中间件类中包含 process_exception 函数的时候, 调用的顺序跟注册的顺序是相反的
也就是:
- process_request(self,request)
- process_view(self, request, callback, callback_args, callback_kwargs)
- process_template_response(self,request,response)
- process_exception(self, request, exception)
- process_response(self, request, response
class TestMiddleware(object):
"""中间类"""
def __init__(self):
"""服务器重启之后, 接受第一个请求时调用"""
print("__init__执行")
def process_request(self, request):
"""产生 request 对象之后, url 匹配之前调用"""
print("process_request__中间件函数执行")
def process_view(self, request, **args, **kwargs):
""" url 匹配之后, 调用视图函数之前调用"""
print("process_view中间件函数调用")
def process_response(self, request, response):
"""试图函数调用之后, 内容返回浏览器之前"""
print("process_response__中间件函数执行")
注意: 如果注册的多个中间件类中包含 process_exception 函数的时候, 调用的顺序跟注册的顺序是相反的
class ExceptionTest1Middleware(object):
def process_exception(self, request, exception):
"""视图函数调用之后, 内容返回浏览器之前"""
print("process_exception1中间件哈桉树执行")
class ExceptionTest2Middleware(object):
def process_exception(self, request, exception):
"""视图函数调用之后, 内容返回浏览器之前"""
print("process_exception2中间件哈桉树执行")
5. 中间件应用场景
由于中间件工作在 视图函数执行前、执行后(像不像所有视图函数的装饰器!)适合所有的请求/一部分请求做批量处理
1、做IP限制
放在 中间件类的列表中,阻止某些IP访问了;
2、URL访问过滤
如果用户访问的是login视图(放过)
如果访问其他视图(需要检测是不是有session已经有了放行,没有返回login),这样就省得在 多个视图函数上写装饰器了!
3、缓存(还记得CDN吗?)
客户端请求来了,中间件去缓存看看有没有数据,有直接返回给用户,没有再去逻辑层 执行视图函数
参考资料:
https://www.cnblogs.com/lzpblog/p/6483442.html
https://www.cnblogs.com/huchong/p/7819296.html
https://www.cnblogs.com/amou/p/9625366.html
Django中间件执行流程的更多相关文章
- Django中间件执行顺序
中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django ...
- koa2入门--03.koa中间件以及中间件执行流程
//中间件:先访问app的中间件的执行顺序类似嵌套函数,由外到内,再由内到外 //应用级中间件 const koa = require('koa'); var router = require('ko ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
- django中间件及中间件实现的登录验证
1.定义 一个用来处理Django的请求和响应的框架级别的钩子(函数),相对比较轻量级,并且在全局上改变django的输入与输出(使用需谨慎,否则影响性能) 直白的说中间件就是帮助我们在视图函数执行之 ...
- session与cookie,django中间件
0819自我总结 一.session与cookie 1.django设置session request.session['name'] = username request.session['age' ...
- cookie与session django中间件
目录 一.什么是cookie 二.django中操作cookie 2.1 如何操作cookie 2.2 操作cookie 三.什么是session 四.django中操作session 4.1 创建c ...
- (day58)十、Cookie、Session、Token、Django中间件
目录 一.Cookie (一)由来 (二)什么是Cookie (三)Django中操作Cookie (1)设置Cookie (2)获取Cookie (3)删除Cookie 二.Session (一)由 ...
- cookie和session django中间件
目录 一.cookie和session 1. 为什么要有cookie和session 二.cookie 1. 什么是cookie 2. django中关于cookie的使用 (1)后端设置cookie ...
- python中django中间件
一.中间件 所谓的中间件,就是存在socket和视图函数中间的一种相当于过滤的机构. 中间件共分为: (1)process_request(self,request) (2)process_view( ...
随机推荐
- vue 之 Vue.extend()
Vue.extend( options ) 参数: {Object} options 用法: 使用基础 Vue 构造器,创建一个“子类”.参数是一个包含组件选项的对象. data 选项是特例,需要注意 ...
- 京东Java面试题(一)
1.说一下java类集2.字符串哈西相等,equals相等吗?反过来呢?3.Spring的工作原理,控制控制反转是怎么实现的,自己写过滤器过滤编码怎么实现4.框架的源码有没有看过5.动态代理是怎么实现 ...
- HDU 3455
http://acm.hdu.edu.cn/showproblem.php?pid=3435 同下题,只是这题是双向边,同时让我认识到了一个问题,一个图拆点做二分图完美匹配的本质是求该图环的并 htt ...
- Linux下XordDos木马的清除
朋友的阿里云服务器一早上报木马入侵,找我处理,登陆阿里云查看警告信息“恶意进程(云查杀)-XorDDoS木马”, 本文也可以作为服务器处理木马排查的步骤的参考文章 排查原则: 1.一般的木马都有多个守 ...
- c++跨文件变量声明
常量是内部链接的,可以直接定义; 变量是外部链接,如果在头文件定义的话,如果出现多次引用同一个头文件的编译单元,就会引发multi redifine错误, 这个时候就要只是声明变量来解决:exter ...
- mvc之URL篇
一.根据路由系统生成友好的URL ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName); 会根据当前的路 ...
- ppt正文排版
- matplotlib-------标记特殊点
import matplotlib.pyplot as plt import numpy as np def demo_test(): a=np.array([0.15,0.16,0.14,0.17, ...
- 使用slot编写弹窗组件
具体slot用法详见http://www.cnblogs.com/keepfool/p/5637834.html html: <!--测试弹窗--> <dialog-test v-i ...
- 1、ECMAScript 6 简介
ECMAScript 和 JavaScript 的关系 ES6 与 ECMAScript 2015 的关系 语法提案的批准流程 ECMAScript 的历史 部署进度 Babel 转码器 Traceu ...