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( ...
随机推荐
- Linux/Mac OS 个人常用Terminal技巧整理
刚开始接触linux有些不适应,走了不少弯路,一直没有系统的学过linux应用,基本都是零零散散Google出来的知识,在这里做个整理: Vi/Vim 基本操作: 刚开始接触linux时,不懂vi吃了 ...
- flash存储原理
norflash 带有 SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内容每一字节:nandflash器件使用复杂的IO口串行的存取数据,读写操作采用512字节的块(也就是读/写某个字节,必 ...
- TypeError: HashUpdate fail
关于crypto的md5加密报错: 代码: var crypto = require('crypto'); var md5 = crypto.createHash('md5'); //crypto模块 ...
- linux下源码安装jdk1.8和tomcat8.5
Java是目前可移植性较高的语言,相当火热,tomcat运行就需要Java语言环境 0.java简介 1)tomcat运行需要对应的Java环境,Java环境通过安装jdk来获得2)为了防止兼容性问题 ...
- Binary file to C array(bin2c)
/******************************************************************************** * Binary file to C ...
- POJ 2407:Relatives(欧拉函数模板)
Relatives AC代码 Relatives Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16186 Accept ...
- [HRBUST-1688]数论中的异或(思维题)
数论中的异或 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 75(41 users) Total Accepted: 35(30 us ...
- Codeforces Beta Round #81 A Transmigration
在魔界战记中有一个设定叫做转生,当一个人物转生时,会保留之前的技能,但是技能等级需要乘以一个系数 k ,如果技能等级小于100,将会在转生之后失去该技能. 转生之后,会学到一些新技能.这些新技能附加的 ...
- 结构体:HASH表模板
这种 HASHMAP 就是一个链式前向星的表: 其中: init 函数:hashmap 创建初始化: check 函数:寻找 hash 表中是否有需要查找的值,若有则返回 1 ,否则返回 0 :遍历方 ...
- 【转】每天一个linux命令(47):iostat命令
原文网址:http://www.cnblogs.com/peida/archive/2012/12/28/2837345.html Linux系统中的 iostat是I/O statistics(输入 ...