Django中间件(含Django运行周期流程图)
Django中的中间件(含Django完整生命周期图)
Django中间件简介
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法
在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件

MIDDLEWARE = [
'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',
]

Django请求的一个生命周期图1
Django请求的一个生命周期图2
可以看出当一个请求来时,会依次执行每一个中间件中的process_request函数,再通过路由找到对应的视图函数执行,求情完成后,会再一次经过每一个中间件的process_response函数,再返回给浏览器
因此我们如果有一些操作是需要在执行每个views视图函数之前就要执行的可以添加中间件进行执行(如登录验证)
中间件与装饰器的选择
以后想要对所有的请求做统一操作时,用中间件
只是对少量的视图函数做操作时,用装饰器
中间件的写法
首先在项目内任意创建一个目录,在目录下创建一个py文件,名字随意
在该py文件中写中间件的类,这个类需要继承MiddlewareMixin(在1.7或1.8等老版本django中只需要继承object类即可)

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect class AuthMiddleware(MiddlewareMixin):
def process_request(self,request):
# 如果么有返回值;返回None,表示可以继续往下执行
# 如果有返回值,执行自己的response以及以上的response。 if request.path_info == '/login/':
return None user_info = request.session.get('user_info')
if not user_info:
# return HttpResponse('请登录')
return redirect('/login/') def process_response(self,request,response):
return response

在settings中配置

MIDDLEWARE = [
'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',
'app01.middleware.auth.AuthMiddleware', # 中间件的路径
]

process_request和process_response的参数
process_request参数
self,request

def process_request(self,request):
# 如果么有返回值;返回None,表示可以继续往下执行
# 如果有返回值,执行自己的response以及以上的response。 if request.path_info == '/login/':
return None user_info = request.session.get('user_info')
if not user_info:
# return HttpResponse('请登录')
return redirect('/login/')

process_response参数
self,request,response
def process_response(self,request,response):
return response
process_request和process_response的返回值
process_request返回值
当process_request函数没有返回值(默认为None)或者返回None时,请求会接着往后走,执行后面的中间件直到视图函数
当process_request函数有返回值时,请求将不会再往后走,而是直接执行该中间件的process_response函数,并接着执行前面中间的process_response函数,直至返回给浏览器
process_response返回值
必须有返回值,否则会报错,返回response
Django中间件(含Django运行周期流程图)的更多相关文章
- Django 2.0 学习(20):Django 中间件详解
Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...
- Django 中间件简介
Django 中间件简介 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. ...
- django中间件和auth模块
Django中间件 由django的生命周期图我们可以看出,django的中间件就类似于django的保安,请求一个相应时要先通过中间件才能到达django后端(url.views.template. ...
- django——中间件
1.中间件概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响 ...
- 11.Django|中间件
中间件 文件夹为middlewareDemo 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨 ...
- Django组件(三) Django之中间件
中间件概述 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到性 ...
- Django中间件解析
一,中间件的概念 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法.在dja ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
- Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)
Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造) 摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...
随机推荐
- mongdb复制集搭建
可参考官网教程 复制集增加了数据的冗余同时也提高了mongodb的可靠性,相比传统的主从架构,mongodb具有自动容灾的特性,即主库挂掉后会自动从剩下的从库中选举出一个节点做为主库(不需要人工干预) ...
- 目录视图摘要视图订阅 基于Extjs开发不允许为空的文本框提示及相应的验证错误提示(转)
原文地址:http://blog.csdn.net/kunoy/article/details/8007585 本文主要解决问题: 1.区分哪些文本框不允许为空,很多网站都采用在文本框后加*号,ext ...
- hdu6005 Pandaland 想法+dijkstra
/** 题目:hdu6005 Pandaland 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6005 题意:给定一个带权无向图,求权值和最小的环的值,如 ...
- 如何Vue-cli开始使用在Vue.js项目中启动TDD(测试驱动开发)
通常,使用测试驱动开发(TDD)最困难的部分是开始.你必须下载带有奇怪依赖项的软件包,让测试套件与你的构建系统协同工作,然后你必须弄清楚如何编写一个测试!难怪这么多的开发者在你提起它的时候就开始跑开了 ...
- Centos7安装Apache Http服务器无法访问如何解决
1. 安装Apache组件 [root@mycentos shell]# yum install httpd 2. 安装成功后,检测有无httpd进程 [root@mycentos shell]# p ...
- C++ Scoket的升级版(多态的运用)
//Socket报文发送c++升级版 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; #in ...
- redhat ent6.5使用centos yum
转载自:http://blog.csdn.net/zhngjan/article/details/20843465 搜狐镜像库:mirrors.sohu.com 163镜像库:mirrors.163. ...
- 利用Java编写简单的WebService实例
使用Axis编写WebService比較简单,就我的理解,WebService的实现代码和编写Java代码事实上没有什么差别,主要是将哪些Java类公布为WebService. 以下是一个从编写測试样 ...
- SQL语句的添加、删除、修改多种方法 —— 基本操作
添加.删除.修改使用db.Execute(Sql)命令执行操作 ╔----------------╗ ☆ 数据记录筛选 ☆ ╚----------------╝ 注意:单双引号的用法可能有误(没有测试 ...
- Delphi StringReplace – 替换字符函数
Delphi StringReplace – 替换字符函数 Delphi中的StringReplace函数是SysUtils单元中自带的函数,该函数可以替换字符串中的指定字符. 1 2 3 4 5 6 ...