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( ...
随机推荐
- Windows 下python的tab自动补全
方法一:安装一个ipython就OK啦,而且关键字还能高亮显示呢 一.打开cmd,输入pip3 install ipython联网安装 二.安装成功后,cmd里运行ipython,成功啦. 方法二:写 ...
- 求a^b
时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求a^b 由于结果可能很大,我们现在只需要知道这个值 mod 1012就可以了(为什么是1012?我的生日) ...
- 如何在magento添加推荐分类
Magento Featured Category推荐分类模块安装 1.下载Magento Featured Categories Extension,下载地址:http://www.storefro ...
- CentOS7安装OpenStack(Rocky版)-03.安装Glance镜像服务组件(控制节点)
上篇文章分享了keystone的安装配置,本文接着分享openstack的镜像服务glance. --------------- 完美的分割线 ---------------- 3.0.glance概 ...
- OK335xS CAN device register and deiver match hacking
/************************************************************************* * OK335xS CAN device regi ...
- Springboot中使用缓存
在开发中,如果相同的查询条件去频繁查询数据库, 是不是会给数据库带来很大的压力呢?因此,我们需要对查询出来的数据进行缓存,这样客户端只需要从数据库查询一次数据,然后会放入缓存中,以后再次查询时可以从缓 ...
- hdu1080 DP(类最长公共子序列)
题意,有两个字符串,分别由四个字母构成,字母之间有不同的相似度,允许在两个字符串都按原顺序排列的情况下进行字母与字母之间的匹配,也可以让字母与空格匹配,即相当于在字符串中间加空格来一一匹配,每个字母与 ...
- 【vue】Mac上安装Node和NPM
http://bubkoo.com/2017/01/08/quick-tip-multiple-versions-node-nvm/ 作为前端开发者,node和npm安装必不可少.然而有时会因为安装新 ...
- hasura graphql-engine v1.0.0-alpha25 的几个方便功能
hasura graphql-engine 是一个很不错的graphql 引擎,但是我们的数据模型经常可能会有变动, 但是以前的版本对于这些的处理,官方的方式是删除元数据,重启server,都不是很好 ...
- smarty学习——内建函数(部分接上)
9.{foreach} {foreachelse} 格式如下: {foreach $arrayvar as $itemvar} {foreach $arrayvar as $keyvar=>$i ...