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( ...
随机推荐
- [LeetCode&Python] Problem 496. Next Greater Element I
You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of n ...
- nginx服务相关操作
安装目录 和大多软件一样一般安装在 /usr/local/ 目录下 /usr/local/ 命令man Usage: nginx [-?hvVt] [-s signal] [-c filename] ...
- ZOJ2067 经典 DP(单调队列优化)
题目:一个由‘.’和‘#’组成矩形,统计里面'.'组成的矩形的个数. 点击打开链接 自己写挂了,懒得搞了 #include <stdio.h> #include <string.h& ...
- ThinkPHP AJAX分页及JS缓存的应用
//AJAX分页详见兄弟连PHP项目视频教程22讲35分钟左右 主要实现是需要将分页中的每个链接都改为AJAX请求 //前端缓存技术:基于javascript传输的数据,只要浏览器没关,都保存在内存中 ...
- (精)AVL树旋转共8种情况(涵盖所有考研的范围)
- day41 python【事物 】【数据库锁】
MySQL[五] [事物 ][数据库锁] 1.数据库事物 1. 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性 ...
- hangfire docker-compose 运行
hangfire 是一款基于.net 的任务调度系统 docker-compose 文件 version: '3' services: hangfire: image: direktchark/han ...
- 转oracle 学习 - 表空间
Oracle 数据库的表空间和 Oracle 数据库数据文件 关于 Oracle 数据库的表空间. 很多 Oracle 初学者弄不明白表空间的概念和意义,他们只知道给数据库建表的时候需要到表空间这个东 ...
- 【转】每天一个linux命令(33):df 命令
原文网址:http://www.cnblogs.com/peida/archive/2012/12/07/2806483.html linux中df命令的功能是用来检查linux服务器的文件系统的磁盘 ...
- mysql复制表结构create table as和like的区别
对于MySQL的复制相同表结构方法,有create table as 和create table like 两种,区别是什么呢? create table t2 as select * from t1 ...